SpringTemplate с Jdk 11 периодически выдает исключение сброса соединения

Я использую 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.

  1. Пытался настроить с помощью -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
  2. Пробовал установить SocketFactory с этими протоколами на RestTemplate.
  3. Пробовал увеличить 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);

Он не должен выдавать прерывистую ошибку сброса соединения


person Nagendran Alagesan    schedule 22.08.2019    source источник
comment
Возможный дубликат JDK 11 SSL Ошибка действительного сертификата (работает в предыдущих версиях)   -  person soorapadman    schedule 23.08.2019
comment
Я не получаю исключение рукопожатия ssl. Моя проблема здесь в другом. Это происходит с перерывами.   -  person Nagendran Alagesan    schedule 23.08.2019


Ответы (2)


У нас возникла аналогичная проблема после добавления org.apache.httpcomponents:httpclient в путь к классам. Это неявно изменило фабрику запросов RestTemplate с SimpleClientHttpRequestFactory на HttpComponentsClientHttpRequestFactory.

Указание explicilty SimpleClientHttpRequestFactory в качестве фабрики запросов решило проблему:

restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory());
person Miroof    schedule 05.08.2020

Мы видели аналогичную проблему с использованием Fluent и его пула соединений.

Нашим самым простым обходным решением было ограничение стратегии поддержания активности в пуле соединений до 90 секунд, и проблема исчезла. Это приводит меня к мысли, что соединение, которое больше не открыто, кажется открытым, передается для использования, но при использовании оно больше не открыто и взрывается.

Очевидно, что это стоит немного больше, поскольку вы увеличиваете частоту рукопожатий и т. Д., Но вы также уменьшаете количество проблем со сбросом соединения.

person Kingpin2k    schedule 28.10.2019