【发布时间】:2018-10-07 23:49:44
【问题描述】:
调用 POST API 时出现 SocketException 但是,我的客户端机器在 VPC(虚拟私有云)下,而服务器在开放云中(没有任何防火墙)。
当我们调用这个 API 时,我们会在一毫秒内得到异常
我的客户端配置如下
request.timeout.in.ms=10000
连接.timeout.in.ms=10000
socket.timeout.in.ms=600000
max.total.connection=100
max.per.route=100
注意:此异常在中间发生(并非总是)
请帮帮我
下面是堆栈跟踪
org.springframework.web.client.ResourceAccessException:对“http://xxxxxxxx:8080/resources/internal/xxx/xxx/xxx”的 POST 请求的 I/O 错误: 连接重置;嵌套异常是 java.net.SocketException: Connection reset 在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:666) 在 org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613) 在 org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:407) 在 com.my.org.ext.client.RestClient.aggregate(RestClient.java:78) 在 com.my.org.ext.service.PExternalServiceImpl.aggregate(PExternalServiceImpl.java:164) 在 sun.reflect.GeneratedMethodAccessor270.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 在 com.sun.proxy.$Proxy145.aggregate(未知来源) 在 com.my.org.ext.service.ExternalServiceImpl.receiveMessage(ExternalServiceImpl.java:534) 在 sun.reflect.GeneratedMethodAccessor265.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:180) 在 org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:112) 在 org.springframework.kafka.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:48) 在 org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:174) 在 org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:72) 在 org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:47) 在 org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:764) 在 org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:708) 在 org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:544) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748) 引起:java.net.SocketException:连接重置 在 java.net.SocketInputStream.read(SocketInputStream.java:210) 在 java.net.SocketInputStream.read(SocketInputStream.java:141) 在 org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137) 在 org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153) 在 org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:282) 在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138) 在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56) 在 org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259) 在 org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163) 在 org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:165) 在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273) 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125) 在 org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272) 在 org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185) 在 org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) 在 org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111) 在 org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) 在 org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:89) 在 org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) 在 org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) 在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:652) ...省略了28个常用框架,我通过What's causing my java.net.SocketException: Connection reset? 但我不确定到底是什么问题以及如何解决。
【问题讨论】:
-
你找到答案了吗?我们间歇性地发生这种情况。谢谢
-
是的,在为 RestTemplate bean 创建 HttpClient 时,我添加了 evictIdeleConnection 属性并且它起作用了,我再也没有收到这个异常了。 HttpClients.custom().setDefaultRequestConfig(requestConfig) .setConnectionManager(connManager) .evictIdleConnections(IDLE_CONNECTION_WAIT_TIME, TimeUnit.SECONDS).build();
-
谢谢,我试试看。
标签: java spring rest networking vpc