Тайм-аут внешнего клиента
В нашем приложении Spring мы опираемся на внешнюю систему. Мы хотим установить время ожидания для запросов к этой системе, но не можем понять, как это настроить.
Мы используем это:
return clientBuilder.build()
.target(baseUrl)
.register(jsonProvider)
.register(jsonAcceptHeaderClientRequestFilter)
.register(new LoggingFilter());
Я пробовал это: Как установить соединение и прочитать тайм-аут с Джерси 2.x? и много других предложений, но не могу заставить его работать. Мы ценим любые предложения.
Обновление вещей, которые не работают:
.property("http.connection.timeout", 1)
.property("http.receive.timeout", 1)
Так же как
.property(ClientProperties.CONNECT_TIMEOUT,1)
.property(ClientProperties.READ_TIMEOUT,1)
2 ответа
Как подтверждено в ответе, связанном в вашем вопросе, один из комментариев @df778899 и согласно моим тестам, приведенное ниже использование работает нормально, для клиента jersey
target(baseUrl)
.property(ClientProperties.CONNECT_TIMEOUT, 1000)
.property(ClientProperties.READ_TIMEOUT, 1000)
И производит java.net.SocketTimeoutException
, если внешний сервер не отвечает в течение установленного времени.
Для клиента Apache CXF я протестировал приведенный ниже фрагмент, и он работает для тайм-аутов чтения. И это официальная ссылка. Найдите параметры, использованные в приведенном ниже фрагменте на этой странице.
Примечание: для версий, когда это было поддержано, отметьте этот JIRA.
target(baseUrl)
.property("http.connection.timeout", 5000)
.property("http.receive.timeout", 5000)
Обновление: ниже содержание может не потребоваться OP, но сохранение ради академиков.,
Я догадываюсь, что ты преследуешь другую цель. Мне кажется, что ваша внешняя система на самом деле реагирует, но, возможно, со скоростью, меньшей, чем вы хотели бы, ИЛИ сам ответ больше, что, в свою очередь, потребляет больше времени, чем вы хотите?
В таких случаях вы можете настроить параметры тайм-аута. Но они работают на основе периодического чтения сокетов. Итак, учтите, что вы установили время ожидания X
и ваши данные ответа Y
байт. Медленное чтение может означать, что вызов socket.read() поступает с данными, но их содержимое составляет 1/2 байта. X
относится к каждому чтению. Так что полное чтение может, в теории взять X*Y
Миз.
Если выше действительно ваша проблема, то вам, возможно, придется решить эту проблему с помощью внешнего хронометриста. Например, вы можете:
- Выполните внешний вызов службы через ExecutorService.submit(задача Callable
) - И затем, вызовите полученный Future.get(длинный тайм-аут, блок TimeUnit)
Вы можете использовать server.connection-timeout
, но это установит тайм-аут для всех запросов, а не только тех, которые были отправлены во внешнюю систему.
server.connection-timeout = # Время, в течение которого соединители ожидают другой HTTP-запрос, прежде чем закрывать соединение. Если не задано, используется значение по умолчанию для конкретного соединителя. Используйте значение -1, чтобы указать отсутствие (то есть бесконечное) время ожидания.