Как бы вы предоставили возврат в течение X секунд семантики для запроса сервлета? - PullRequest
2 голосов
/ 01 февраля 2011

Мой клиент хочет, чтобы мой сервлет мог возвращать результаты в течение X секунд, если есть что вернуть, иначе верните zt X секунд с сообщением типа "извините, не удалось вернуться в течение указанного времени"

Этодействительно синхронный вызов сервлета с таймаутом.Существует ли установленная модель для такого поведения?

Каков идеальный способ сделать это?

1 Ответ

3 голосов
/ 01 февраля 2011

Поток обработчика запросов создает BlockingQueue с именем myQueue и передает его рабочему потоку, который после завершения помещает свой результат в очередь.Затем поток обработчика вызывает «myQueue.poll(X, TimeUnit.SECONDS)» и возвращает сериализованный результат, если он получает одну или вашу ошибку «тайм-аута», если вместо этого он получает значение «ноль» (имеется в виду тайм-аут вызова «опрос»).Вот пример того, как это может выглядеть:

// Servlet handler method.
BlockingQueue<MyResponse> queue = new ArrayBlockingQueue<MyResponse>();
Thread worker = new Thread(new MyResponseGenerator(queue));
worker.start();
MyResponse response = queue.poll(10, TimeUnit.SECONDS);
if (response == null) {
  worker.interrupt();
  // Send "timeout" message.
} else {
  // Send serialized response.
}

Обратите внимание, что управление потоками в целом (но особенно в контейнере сервлета) полно ловушек, поэтому вы должны очень хорошо ознакомиться со спецификацией и поведением сервлетавашего конкретного контейнера сервлета перед использованием этого шаблона в производственной системе.

Использование ThreadPool - это еще один вариант, который следует рассмотреть, но добавит еще один уровень сложности.

...