Spring WebServiceTemplate 导致频繁间歇性 java.net.SocketException: Connection reset

问题描述

我们在应用程序日志中看到频繁的间歇性java.net.socketException:连接重置错误。我一直在阅读类似的其他问题,但找不到相关的解决方案来修复或在本地环境中重现错误方法。有人可以指导吗?

客户端的 HTTPClient 代码(以下所有超时设置为 60000)

    @postconstruct
    public void init() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setcontextpaths(CONTEXT_PATH);
        setMarshaller(marshaller);
        setUnmarshaller(marshaller);

        PoolingHttpClientConnectionManager poolingConnManager = new PoolingHttpClientConnectionManager();
        poolingConnManager.setDefaultMaxPerRoute(10);
        RequestConfig config = RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT)
                .setConnectionRequestTimeout(REQUEST_TIMEOUT)
                .setSocketTimeout(SOCKET_TIMEOUT).build();
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(poolingConnManager)
                .addInterceptorFirst(new HttpComponentsMessageSender.RemoveSoapHeadersInterceptor())
                .setDefaultRequestConfig(config)
                .build();
        HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender(httpClient);
        getwebservicetemplate().setMessageSender(httpComponentsMessageSender);
        getwebservicetemplate().setDefaultUri("serverURL");
    }

日志中的连接重置错误

java.net.socketException: Connection reset
java.net.socketException: Connection reset
at java.net.socketInputStream.read(SocketInputStream.java:210)
at java.net.socketInputStream.read(SocketInputStream.java:141)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
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.ws.client.core.webservicetemplate.marshalSendAndReceive(webservicetemplate.java:390)
at org.springframework.ws.client.core.webservicetemplate.marshalSendAndReceive(webservicetemplate.java:383)

我无法使用wireshark(如某些地方所建议的那样),因为它需要在生产机器上获得很多权限。我们在这里遗漏了一些明显的东西。这个错误以前从未出现过,最近才开始。申请中没有相关的变化可以怀疑。 为了在本地重现,我尝试将 Thread.sleep 放在服务器应用程序中超过 1 分钟,但这并没有重现连接重置错误。我们正在使用 spring 3、httpclient 4.5.9 并在 tomcat 8 上部署客户端应用程序。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...