【发布时间】:2019-12-28 06:39:22
【问题描述】:
我正在使用 Spring RestTemplate 对另一个服务(NodeJS 服务)进行休息调用。间歇性地收到连接重置错误。升级到 Amazon Corretto JDK 11 和 Spring boot 2.1.5 后,相同的代码在 JDK 8 和 Spring boot 2.0.1 上运行良好,开始看到这个问题。
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)
抑制的异常:
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)
一些博客提到 JDK 11 与 TLS1.3 存在问题
- 尝试使用
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2进行设置 - 尝试使用这些协议将
SocketFactory设置为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);
它不应该抛出间歇性连接重置错误
【问题讨论】:
-
我没有收到 ssl 握手异常。我的问题在这里有所不同。它是间歇性发生的。
标签: spring spring-boot spring-mvc resttemplate java-11