Nag*_*san 2 spring spring-mvc resttemplate spring-boot java-11
我使用 SpringRestTemplate对另一个服务(NodeJS 服务)进行休息调用。间歇性地出现连接重置错误。相同的代码在 JDK 8 和 Spring boot 2.0.1 上运行良好,在升级到Amazon Corretto JDK 11 和 Spring boot 2.1.5 后,开始看到这个问题。
Caused by: javax.net.ssl.SSLException: Connection reset
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:127)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:259)
at java.base/sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1314)
Run Code Online (Sandbox Code Playgroud)
org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:735)
... 143 common frames omitted
Suppressed: java.net.SocketException: Broken pipe (Write failed)
at java.base/java.net.SocketOutputStream.socketWrite0(Native Method)
at java.base/java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:110)
at java.base/java.net.SocketOutputStream.write(SocketOutputStream.java:150)
Run Code Online (Sandbox Code Playgroud)
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2SocketFactory这些协议设置为RestTemplate.socketTimeout重置客户端。仍然没有运气。
#代码:#
HttpHeaders headers = new HttpHeaders();
headers.set(AUTHORIZATION, getHeader());
headers.set(OAuth2AccessToken.ACCESS_TOKEN, token);
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<Object> resEntity = null;
resEntity = this.restTemplate.exchange(checkTokenEndpointUrl,
HttpMethod.GET, entity, Object.class);
Run Code Online (Sandbox Code Playgroud)
它不应该抛出间歇性连接重置错误
小智 5
添加org.apache.httpcomponents:httpclient类路径后,我们遇到了类似的问题。这将 RestTemplate 请求工厂从 隐式更改SimpleClientHttpRequestFactory为HttpComponentsClientHttpRequestFactory。
指定明确SimpleClientHttpRequestFactory作为请求工厂解决了这个问题:
restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory());
Run Code Online (Sandbox Code Playgroud)
我们使用 Fluent 及其连接池看到了类似的问题。
我们最简单的解决方法是将连接池中的保持活动策略限制为 90 秒,问题就消失了。这让我相信不再打开的连接看起来是打开的,被移交以供使用,但在使用时它不再打开并爆炸。
显然,当您增加处理握手等的频率时,这会花费更多,但您也会减少连接重置问题。
| 归档时间: |
|
| 查看次数: |
3957 次 |
| 最近记录: |