spring - 带有 Jdk 11 的 SpringTemplate 间歇性地抛出连接重置异常
问题描述
我使用 SpringRestTemplate
对另一个服务(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);
它不应该抛出间歇性连接重置错误
解决方案
添加类路径后,我们遇到了类似的问题org.apache.httpcomponents:httpclient
。这隐式地将 RestTemplate 请求工厂从 更改SimpleClientHttpRequestFactory
为HttpComponentsClientHttpRequestFactory
。
将明确指定SimpleClientHttpRequestFactory
为请求工厂解决了问题:
restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory());
推荐阅读
- windows - 实时监控windows日志文件中的错误
- vue.js - 如何使用 Vue 和 Vuetify 将数据路由到新页面以填写表单?
- ios - 带有 UIImagePickerControllerDelegate 和 xcode 12 的图像 nil
- ocaml - 如何拥有嵌套库?对沙丘等感到困惑
- concrete - 无法通过 localhost 访问具体 5
- javascript - 创建时的 Discord.js 提升角色
- c++ - ilcplex/ilocplex.h:没有这样的文件或目录
- swift - Firebase 用户身份验证
- node.js - 哪里提到了 Database.serialize()?节点 SQLite
- c# - 从 google auth 获取访问代码后,我应该调用什么 url 来获取 json ?