IBM WAS 9.0报RC:32 Broken pipe致504网关超时原因咨询
运行环境
- 应用框架:Spring 5.3.13(REST Controller 模式)
- 应用服务器:IBM WAS 9.0
- JDK版本:1.8
异常表现
- 生产者服务端业务逻辑已经正常执行完成、结束请求处理流程,但应用日志仍抛出IO异常,核心错误信息为
Async IO operation failed (1), reason: RC: 32 Broken pipe,完整异常堆栈:
Caused by: java.io.IOException: Async IO operation failed (1), reason: RC: 32 Broken pipe at com.ibm.io.async.AsyncLibrary$IOExceptionCache.<init>(AsyncLibrary.java:924) ~[com.ibm.ws.runtime.jar:?] at com.ibm.io.async.AsyncLibrary$IOExceptionCache.get(AsyncLibrary.java:937) ~[com.ibm.ws.runtime.jar:?] at com.ibm.io.async.AsyncLibrary.getIOException(AsyncLibrary.java:951) ~[com.ibm.ws.runtime.jar:?] at com.ibm.io.async.AbstractAsyncChannel.multiIO(AbstractAsyncChannel.java:482) ~[com.ibm.ws.runtime.jar:?] at com.ibm.io.async.AsyncSocketChannelHelper.write(AsyncSocketChannelHelper.java:478) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.tcp.channel.impl.AioSocketIOChannel.writeAIOSync(AioSocketIOChannel.java:353) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.tcp.channel.impl.AioTCPWriteRequestContextImpl.processSyncWriteRequest(AioTCPWriteRequestContextImpl.java:126) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.tcp.channel.impl.TCPWriteRequestContextImpl.write(TCPWriteRequestContextImpl.java:122) ~[?:CCX.CF [o1800.01]] at com.ibm.ws.ssl.channel.impl.SSLUtils.flushCloseDown(SSLUtils.java:214) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.ssl.channel.impl.SSLUtils.shutDownSSLEngine(SSLUtils.java:126) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.cleanup(SSLConnectionLink.java:228) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.close(SSLConnectionLink.java:172) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.close(HttpInboundLink.java:899) ~[com.ibm.ws.runtime.jar:?] at com.ibm.wsspi.channel.base.InboundApplicationLink.close(InboundApplicationLink.java:58) ~[?:CCX.CF [o1800.01]] at com.ibm.ws.webcontainer.channel.WCChannelLink.close(WCChannelLink.java:333) ~[com.ibm.ws.webcontainer.jar:?] at com.ibm.ws.webcontainer.channel.WCChannelLink.releaseChannelLink(WCChannelLink.java:503) ~[com.ibm.ws.webcontainer.jar:?] at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:405) ~[com.ibm.ws.webcontainer.jar:?] at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:465) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:532) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:318) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:289) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.determineNextChannel(SSLConnectionLink.java:1187) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.ssl.channel.impl.SSLConnectionLink$MyReadCompletedCallback.complete(SSLConnectionLink.java:694) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1833) ~[com.ibm.ws.runtime.jar:?] at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175) ~[com.ibm.ws.runtime.jar:?] at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) ~[com.ibm.ws.runtime.jar:?] at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) ~[com.ibm.ws.runtime.jar:?] at <unknown class>.<unknown method>(Unknown Source) ~[?:?] at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) ~[com.ibm.ws.runtime.jar:?] at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) ~[com.ibm.ws.runtime.jar:?]
- 链路中的消费者端收到
504 Gateway Timeout错误,该问题与生产者侧抛出的Broken pipe异常直接相关,核心疑问为RC:32 Broken pipe错误的具体触发原因。
RC:32 Broken pipe 触发原因
RC:32是IBM WAS异步IO组件返回的标准系统错误码,对应TCP协议层的断管错误,本质是WAS尝试向一个已经被对端主动关闭的TCP连接执行写操作时触发的系统级错误。
结合当前场景,错误触发的完整链路是:
- 消费者的请求经过前置网关/负载均衡转发到WAS上的Spring服务,业务逻辑开始执行。
- 接口实际处理耗时超过了前置网关配置的后端读超时阈值,网关判定后端服务响应超时,直接向消费者返回504状态码,同时主动发送RST报文断开和WAS之间的TCP连接。
- 此时WAS上的Spring业务逻辑其实已经执行完成,但WAS开始执行响应写回、SSL连接关闭前的缓冲区flush、连接资源清理等操作时,发现对应的TCP连接已经被对端(网关)关闭,异步IO写操作无法完成,就会抛出RC:32 Broken pipe异常。
常见的具体诱因包括:
- 接口业务处理耗时过长,超过前置网关、负载均衡配置的后端响应超时时间
- Spring REST接口使用了异步返回能力(如
DeferredResult、Callable、WebAsyncTask),业务线程处理完成后通知Web容器写响应的环节存在延迟,导致响应迟迟没有发出去,超过上游等待阈值 - WAS的连接保持、异步IO超时配置和上游中间件的超时配置不匹配,比如WAS配置的连接空闲存活时间远长于网关的空闲连接回收时间,网关已经回收了连接,WAS仍尝试向该连接写数据
- 网络链路存在丢包、防火墙/中间设备主动回收长连接的情况,导致TCP连接被异常中断
这类错误本身不代表业务逻辑执行失败,只是代表响应写回环节因为连接提前断开失败,如果业务逻辑没有做幂等,要注意重复请求带来的数据一致性问题。
内容的提问来源于stack exchange,提问作者Vasanth
相关产品推荐
相关产品推荐

