В настоящее время я использую RestTemplate
при поддержке http-клиента Apache 4.5.6 на своем веб-сервере для выполнения http-запросов. Моя HttpClient
конфигурация выглядит следующим образом:
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(httpConfigurationProperties.getConnection().getMaxTotal());
connectionManager.setDefaultMaxPerRoute(httpConfigurationProperties.getConnection()
return HttpClients.custom()
.setDefaultRequestConfig(RequestConfig
.custom()
.setConnectionRequestTimeout((int) httpConfigurationProperties.getTimeout().getConnectionRequestTimeout().toMillis())
.setConnectTimeout((int) httpConfigurationProperties.getTimeout().getConnectTimeout().toMillis())
.setSocketTimeout((int) httpConfigurationProperties.getTimeout().getReadTimeout().toMillis())
.build())
.setRetryHandler(StandardHttpRequestRetryHandler.INSTANCE)
.setConnectionManager(connectionManager)
.build();
Когда я делаю HTTP GET, время от времени я вижу это:
Исключение ввода-вывода (java.net.SocketException) при обработке
запрос к {s} ->: сброс соединения
Я прочитал в другом посте, что это вызвано тем, что сервер (которому я отправляю запрос) закрывает соединение без информирования клиента. И StandardHttpRequestRetryHandler
смог повторить попытку. Но методы HTTP POST не повторяются, потому что они не являются идемпотентными операциями. Но есть ли конфигурация, которая может избежать этого сброса соединения в первую очередь?
А я пробовал использовать evictExpiredConnections
и не помогает. Поможет ли настройка connectionManager.setValidateAfterInactivity(20000)
проверить соединение перед использованием?
Перед использованием HTTP-клиента Apache я использовал SimpleClientHttpRequestFactory
в RestTemplate
и никогда не сталкивался с проблемами сброса соединения. Любая помощь приветствуется