Тайм-аут внешнего клиента - PullRequest
0 голосов
/ 30 апреля 2018

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

Мы используем это:

   return clientBuilder.build()
            .target(baseUrl)
            .register(jsonProvider)
            .register(jsonAcceptHeaderClientRequestFilter)
            .register(new LoggingFilter());

Я пробовал это: Как установить соединение и считать тайм-аут с помощью Jersey 2.x? и много других предложений, но не могу заставить его работать. Любые предложения будут оценены.

Обновление вещей, которые не работают:

.property("http.connection.timeout", 1)
.property("http.receive.timeout", 1)

А также

.property(ClientProperties.CONNECT_TIMEOUT,1)
.property(ClientProperties.READ_TIMEOUT,1)

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Как подтверждается в ответе, связанном в вашем вопросе, в одном из комментариев @ df778899 и в соответствии с моими тестами, приведенное ниже использование работает нормально, для джерси клиента

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 (длительный тайм-аут, единица времени)
0 голосов
/ 30 апреля 2018

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

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

Ссылки

...