Как получить ответ, если он возвращается после истечения времени ожидания

Я использую веб-службу REST из кода Java, используя HTTP-клиентский API Apache. Если ответ не возвращается в течение времени ожидания сокета, настроенного в параметрах диспетчера соединений, возникает исключение времени ожидания сокета. В таких случаях, когда поток возвращает исключение вызывающему классу, даже если служба REST возвращает ответ через несколько секунд, он будет потерян.

Можно ли создать новый поток, который по-прежнему будет слушать службу даже после тайм-аута и просто регистрировать ответ, в то время как основной поток возвращает исключение вызывающему классу?

Есть ли лучший способ добиться этого?

Спасибо.


person user1919581    schedule 15.12.2015    source источник


Ответы (1)


Шаблон, который вы, скорее всего, ищете, включает асинхронные запросы. Для каждого действия, которое вы публикуете, вы создаете уникальный идентификатор «вакансии» и вместе с ним конкретный URL-адрес для статуса вакансии. После запуска задания вы можете запросить статус этого конкретного экземпляра задания. Например:

  1. ОТПРАВИТЬ в /actions
  2. Возвращает 202 Accepted и включает заголовок Location в /actions/results/1234.
  3. Immediately GET /actions/results/1234 to ascertain it's status.
    • If it returns a 2xx your job is done.
    • Если он возвращает 404, подождите 10 секунд (или сколько угодно) и повторите попытку.
  4. Когда вы будете довольны результатом, нажмите DELETE на /actions/results/1234, чтобы убрать за собой.

Конечно, вам не нужно возвращать 404, если задание не выполнено, есть и другие стратегии проверки статуса — главное, что это последующий вызов.

person SireInsectus    schedule 15.12.2015
comment
Я хочу добиться этой функциональности при синхронном вызове. - person user1919581; 16.12.2015
comment
Тот факт, что вы предлагаете второй поток, подразумевает асинхронный вызов. Помимо этого вопроса, вы сказали, что просто хотите зарегистрировать результат на клиенте - означает ли это, что вам не нужно принимать решение на основе возвращаемого значения? Как в первом вызове можно запустить и забыть, а ваш второй поток может прослушать и затем зарегистрировать результат? - person SireInsectus; 18.12.2015