Я использую Spring RestTemplate
для вызова другого сервиса (сервиса 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)
Подавленное исключение:
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);
Он не должен выдавать прерывистую ошибку сброса соединения