Тайм-аут внешнего клиента

В нашем приложении 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 Миз.

Если выше действительно ваша проблема, то вам, возможно, придется решить эту проблему с помощью внешнего хронометриста. Например, вы можете:

  1. Выполните внешний вызов службы через ExecutorService.submit(задача Callable)
  2. И затем, вызовите полученный Future.get(длинный тайм-аут, блок TimeUnit)

Вы можете использовать server.connection-timeout, но это установит тайм-аут для всех запросов, а не только тех, которые были отправлены во внешнюю систему.

server.connection-timeout = # Время, в течение которого соединители ожидают другой HTTP-запрос, прежде чем закрывать соединение. Если не задано, используется значение по умолчанию для конкретного соединителя. Используйте значение -1, чтобы указать отсутствие (то есть бесконечное) время ожидания.

Ссылка

Другие вопросы по тегам