WSO2 EI 6.4.0推送JSON payload至AWS SQS Queue时出现Target Connection is Stale间歇性错误的解决咨询
我来帮你梳理下这个问题的解决思路,你遇到的这个间歇性连接异常在WSO2 EI与AWS SQS集成的场景里并不少见,结合你的日志和配置需求给你具体建议:
首先看你提供的异常日志:
[2022-08-27 03:08:49,801] [-1] [] [HTTPS-Sender I/O dispatcher-5] WARN {org.apache.synapse.transport.passthru.TargetHandler} - Connection closed by target host while sending the request Remote Address : proxy.abc.com/ 10.0.x.x:3090
[2022-08-27 03:08:49,801] [-1234] [] [PassThroughMessageProcessor-29] ERROR {org.apache.synapse.transport.passthru.PassThroughHttpSSLSender} - IO while building message java.io.IOException: Target Connection is stale.
这个异常的核心原因是:WSO2 EI的HTTP客户端复用了已经被目标端(这里是你的代理服务器proxy.abc.com)关闭的闲置连接,导致发送请求时发现连接已失效。
关于http.connection.stalecheck的配置
你提到的官方文档思路是对的,但要注意参数的实际作用:
http.connection.stalecheck=1是启用连接复用前的 stale 检查,而非禁用。默认情况下这个值通常是0(不检查),所以客户端会直接复用连接,直到发送请求时才发现连接已被后端关闭,从而抛出异常。- 所以正确的操作是将
<ESB_Home>/repository/conf/nhttp.properties中的http.connection.stalecheck设置为1,这样每次复用连接前,客户端会先检查连接是否有效,避免使用已失效的连接。
具体操作步骤
- 打开WSO2 EI安装目录下的
<ESB_Home>/repository/conf/nhttp.properties文件 - 查找
http.connection.stalecheck配置项,如果文件中没有该条目,手动添加一行:http.connection.stalecheck=1 - 重启WSO2 EI服务,让配置生效
额外优化建议
除了开启stale检查,你还可以调整以下配置来进一步避免这类问题:
- 调整连接超时参数:在
nhttp.properties中设置合理的连接超时和socket超时,比如:
(单位为毫秒,30000即30秒,可根据你的业务响应时间调整)http.connection.timeout=30000 http.socket.timeout=30000 - 协调代理服务器的超时设置:日志中显示请求经过了proxy.abc.com,这个代理可能有自己的连接闲置超时规则。如果代理的闲置超时时间比WSO2 EI连接池的闲置时间短,就会出现代理主动关闭连接但客户端还在复用的情况,需要协调调整两边的超时时间匹配。
- 优化连接池闲置回收:可以设置
http.connection.max.idle.time参数,自动回收闲置过久的连接,比如:
这样闲置1分钟的连接会被主动关闭,避免被后端/代理提前关闭。http.connection.max.idle.time=60000
内容的提问来源于stack exchange,提问作者Justin

