Застрявшие потоки с RestTemplate, несмотря на время ожидания чтения и время ожидания соединения

#java #spring #resttemplate #connection-timeout #socket-timeout-exception

#java #весна #resttemplate #время ожидания соединения #сокет-тайм-аут-исключение

Вопрос:

Я использую Spring RestTemplate и HTTP-фабрику, которую я использую с ним HttpComponentsClientHttpRequestFactory .

Я испытывал много застрявших потоков при выполнении HTTP-вызовов из-за проблем с вызываемым сервером. Итак, я настроил тайм-аут чтения, а также тайм-аут соединения с помощью my HttpComponentsClientHttpRequestFactory .

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

Вот мои вопросы:

  • Поскольку у меня есть как тайм-аут чтения, так и тайм-аут соединения, есть мысли о том, почему я все еще получаю потоки, застрявшие при HTTP-вызове на основе RestTemplate?
  • Моя собственная мысль заключается в том, что запрос теряется в сети, я знаю, что это теоретически возможно, но возможно ли это практически в моем случае?
  • Я искал и обнаружил, что могу установить sun.net.client.defaultConnectTimeout и sun.net.client.defaultReadTimeout на уровне JVM, поскольку я уже использую тайм-ауты с моим HttpComponentsClientHttpRequestFactory , окажет ли это какое-либо значимое влияние?

Любые другие мысли или рекомендации о том, как я могу решить эту проблему, будут оценены.


Код находится в виртуальной машине, так что это лучшее, что я могу сделать:

введите описание изображения здесь

Комментарии:

1. Вероятно, было бы полезно, если бы вы могли показать нам код, включающий HttpComponentsClientHttpRequestFactory и устанавливающий значения тайм-аута.

2. @CryptoFool: готово, пожалуйста, проверьте.

3. @pjj привет, похоже, у меня такая же проблема. У меня есть приложение Spring Boot, которое вызывает набор различных служб с помощью RestTemplate. Одним из таких сервисов является ElasticSearch. По какой-то причине у меня периодически возникают зависшие вызовы, которые заканчиваются исключениями тайм-аута. Но если я выполняю вызовы с помощью curl, у меня 100% успех. Какая-нибудь удача с проблемой?

4. @Dmytro: Nops..

5. Привет, pjj, я могу подтвердить, что проблема была либо в HttpClient apache, либо в HttpComponentsClientHttpRequestFactory от Spring. После изменения на SimpleClientHttpRequestFactory, который использует java.net.HttpURLConnection и проверки в производстве в течение нескольких месяцев, я могу подтвердить, что у меня не было ошибок тайм-аута