我们正在使用WSO2
ESB
来克隆和广播SOAP请求到我们在IIS
上托管的所有Web服务。最近我们切换到nhttp
运输。它被配置为推荐here,但每次在不活动时间之后我们在wso.log中加入一个异常
[HTTP Sender I/O dispatcher-4] ERROR ClientHandler I/O error : An existing connection was forcibly closed by the remote host For : 127.0.0.1:4148
java.io.IOException: An existing connection was forcibly closed by the remote host
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:197)
...
非活动期的长度取决于IIS中为特定Web服务配置的'Connection Time-out value'
。似乎WSO2 ESB没有关闭所有打开的套接字连接,而IIS
则在超时期限到期时执行了此操作。
有没有办法避免这种异常?它似乎没有造成一些性能缺陷,但在错误日志中看起来很混乱。
负责线程计数和超时的我们的配置如下:
nhttp.properties
档案:
http.socket.timeout=120000
nhttp_buffer_size=16384
http.tcp.nodelay=1
http.connection.stalecheck=0
http.block_service_list=false
synapse.properties
档案:
synapse.threads.core = 40
synapse.threads.max = 100
#synapse.threads.keepalive = 5
#synapse.threads.qlen = 10
#synapse.threads.group = synapse-thread-group
#synapse.threads.idprefix = SynapseWorker
synapse.sal.endpoints.sesssion.timeout.default=600000
synapse.global_timeout_interval=120000
答案 0 :(得分:1)
默认情况下,WSO2 ESB将使用“KEEPALIVE”进行连接。 当后端(例如IIS)不使用“KEEPALIVE”时,这将导致“远程主机强制关闭现有连接”错误消息。 使用以下属性禁用“KEEPALIVE”:
<property name="NO_KEEPALIVE" value="true" scope="axis2" type="STRING"/>
它可能/可能不直观明显,但是这个“属性”条目被插入到您要连接的后端服务的代理服务的“in”序列中。似乎作者正在其中一个.properties文件中寻找更全局的设置。有,但是对于nhttp.properties和synapse.properties都没有。它将是[carbon_home] /repository/conf/passthru-http.properties中的设置,并设置以下内容以禁用keepalive: http.connection.disable.keepalive =真
答案 1 :(得分:0)
AFAIU,您的后端服务(部署在IIS上)无法在指定的超时值内响应。这意味着,异常是一种有效的方案,因为后端服务器会关闭套接字连接。
我认为您应该检查后端服务无法在没有太多延迟的情况下做出响应的原因。你知道原因吗?
顺便说一下,我猜你使用的是ESB 4.6.0?我建议你使用最新的ESB(版本4.8.0),因为它有很多修复,特别是对于传递传输。
传递传输比nhttp传输更好。