Обработка потоков в сервлетах

#java #multithreading #servlets

#java #многопоточность #сервлеты

Вопрос:

Я работаю над сервлетом, выполнение запроса которого может занять несколько часов. Однако клиент, вызывающий сервлет, заинтересован только в том, был ли запрос получен сервлетом или нет. Клиент не хочет часами ждать, прежде чем получит какой-либо ответ от сервлета. Также, поскольку вызов сервлета является блокирующим вызовом, клиент не может продолжить, пока не получит ответ от сервлета. Чтобы избежать этого, я подумываю о фактическом запуске нового потока в коде сервлета. Поток, запускаемый сервлетом, выполняет трудоемкую обработку, позволяя сервлету очень быстро возвращать ответ клиенту. Но я не уверен, что это приемлемый способ обойти блокирующий характер вызовов сервлетов. Я изучил NIO, но, похоже, это не то, что гарантированно работает в любом контейнере сервлета, поскольку контейнер сервлета также основан на NIO.

Ответ №1:

Что вам нужно, так это планировщик заданий, потому что они гарантируют, что задание будет завершено, даже в случае перезапуска сервера.

Взгляните на планировщики заданий Java OSS, в первую очередь на Quartz.

Ответ №2:

Ваше решение правильное, но создание потоков в корпоративных приложениях считается плохой практикой. Лучше использовать пул потоков или очередь JMS.

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

Ответ №3:

Поток — это неплохо, но я рекомендую передать это пулу исполнителей в качестве задачи. А еще лучше — долго работающий менеджер работы. Неплохая практика быстрого возврата, как вы планируете. Я бы рекомендовал предоставить какой-то отзыв пользователя, указывающий, где пользователь может найти информацию о давно выполняемом задании. Итак:

  1. Создайте задание, представляющее рабочую задачу с уникальным идентификатором
  2. Отправьте задание вашему объекту фонового обработчика (который содержит исполнителя)
  3. Создайте URL-адрес для уникального идентификатора задания.
  4. Возвращает страницу, описывающую, где они могут получить результат

Страница с результатом должна будет согласовываться с этим фоновым менеджером заданий. Во время выполнения вычислений вы можете использовать эту страницу для описания прогресса. Когда это будет сделано, на странице могут отображаться результаты длительно выполняемого задания.