1

我們有幾個Spring出站SOAP WebServices客戶端(與外部WS交談)。我們使用Spring Integration Gateway與他們交談。大型出站負載在Spring集成網關中卡住

版本使用:

Spring Integration version - 4.0.4.RELEASE 
Spring version - 4.1.6.RELEASE 
Spring WS - 2.2.4 
Apache http client - 4.5.1 

所有工作正常時,有效載荷是幾KB。但是,當我們有一個稍大的有效載荷(說700KB,不是我知道的),處理卡住了。線程轉儲給出了以下StackTrace。這發生在Weblogic(12C)和Apache Tomcat中,但僅在Linux上發生。

有人遇到過這個問題嗎? Spring Integration/Gateway內部有一些可以設置writebuffer大小的配置嗎?

java.lang.Thread.State: RUNNABLE 
     at java.net.SocketOutputStream.socketWrite0(Native Method) 
     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
     at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
     at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431) 
     at sun.security.ssl.OutputRecord.write(OutputRecord.java:417) 
     at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:864) 
     at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:835) 
     at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) 
     - locked <0x00000000c31b1d00> (a sun.security.ssl.AppOutputStream) 
     at org.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:126) 
     at org.apache.http.impl.io.SessionOutputBufferImpl.write(SessionOutputBufferImpl.java:162) 
     at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:115) 
     at org.apache.http.entity.ByteArrayEntity.writeTo(ByteArrayEntity.java:116) 
     at org.apache.http.impl.DefaultBHttpClientConnection.sendRequestEntity(DefaultBHttpClientConnection.java:158) 
     at org.apache.http.impl.conn.CPoolProxy.sendRequestEntity(CPoolProxy.java:162) 
     at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:237) 
     at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:122) 
     at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271) 
     at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) 
     at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) 
     at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) 
     at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 
     at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 
     at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) 
     at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) 
     at org.springframework.ws.transport.http.HttpComponentsConnection.onSendAfterWrite(HttpComponentsConnection.java:121) 
     at org.springframework.ws.transport.AbstractWebServiceConnection.send(AbstractWebServiceConnection.java:48) 
     at org.springframework.ws.client.core.WebServiceTemplate.sendRequest(WebServiceTemplate.java:658) 
     at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:606) 
     at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555) 
     at org.springframework.integration.ws.MarshallingWebServiceOutboundGateway.doHandle(MarshallingWebServiceOutboundGateway.java:81) 
     at org.springframework.integration.ws.AbstractWebServiceOutboundGateway.handleRequestMessage(AbstractWebServiceOutboundGateway.java:167) 
     at org.springframework.integration.handler.AbstractReplyProducingMessageHandler$AdvisedRequestHandler.handleRequestMessage(AbstractReplyProducingMessageHandler.java:313) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
     at org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice$1.cloneAndExecute(AbstractRequestHandlerAdvice.java:92) 
     at org.springframework.integration.handler.advice.RequestHandlerRetryAdvice$2.doWithRetry(RequestHandlerRetryAdvice.java:88) 
     at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:263) 
     at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:193) 
     at org.springframework.integration.handler.advice.RequestHandlerRetryAdvice.doInvoke(RequestHandlerRetryAdvice.java:85) 
     at org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice.invoke(AbstractRequestHandlerAdvice.java:69) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
     at com.sun.proxy.$Proxy92.handleRequestMessage(Unknown Source) 
     at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.doInvokeAdvisedRequestHandler(AbstractReplyProducingMessageHandler.java:189) 
     at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:173) 
     at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78) 
     at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
     at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101) 
     at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97) 
     at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77) 
     at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:255) 
     at org.springframework.integration.handler.MessageHandlerChain$ReplyForwardingMessageChannel.send(MessageHandlerChain.java:263) 

UPDATE 我修改HttpClient的的DefaultSocketConfig(爲一個自定義),包括setSndBufSize上一大截。仍然沒有效果!

在運行netstat -ant | grep 443 tcp狀態是CLOSE_WAIT(有時是LAST_ACK)並且在那裏永遠掛起。

+1

'在java.net.SocketOutputStream.socketWrite0(本地方法)'看起來像緩衝區已滿 - 服務器不讀或網絡速度慢 - 您需要運行網絡監視器,如wireshark 。 –

+0

不要這樣想,因爲我們有一個測試應用程序(使用Spring集成/ HttpClient /相同版本),它可以在同一個Linux機器上發送相同的有效負載而沒有任何問題。 – avijendr

+1

嗯,這顯然不是在java.net.SocketOutputStream.socketWrite0(本地方法)的春季代碼' –

回答

1

在java.net.SocketOutputStream.socketWrite0(本機方法)

在我看來像緩衝區已滿 - 服務器沒有閱讀速度不夠快或網絡很慢 - 你需要運行網絡監視器,如wireshark

相關問題