Асинхронная обработка в Java из сервлета - PullRequest
5 голосов
/ 31 января 2009

В настоящее время у меня есть контейнер tomcat - на нем запущен сервлет, который прослушивает запросы. Мне нужно, чтобы результат HTTP-запроса был представлен в очередь заданий, которая затем будет обрабатываться асинхронно. Я хочу, чтобы каждое «задание» сохранялось подряд в БД для отслеживания и восстановления в случае сбоя. Я много читал. Вот мои варианты (обратите внимание, я должен использовать вещи с открытым исходным кодом для всего).

1) JMS - использовать ActiveMQ (но кто является потребителем задания в этом случае другим сервлетом?)

2) Мой запрос создать строку в БД. Имейте отдельный сервлет внутри моего контейнера Tomcat, который всегда работает - он использует Quartz Scheduler или утилиты, предоставленные в java.util.concurrent, чтобы непрерывно обрабатывать строки как задания (использует пул потоков).

Я склоняюсь к последнему, потому что просмотр документации JMS вызывает у меня головную боль, и хотя я знаю, что это более надежное решение, мне нужно реализовать это относительно быстро. Я не ожидаю огромных нагрузок в первые дни развертывания этого сервера в любом случае.

Многие люди говорят, что Spring может подойти как для 1, так и для 2. Однако я никогда не использовал Spring и даже не знаю, как начать использовать его для решения этой проблемы. Любые указатели о том, как погрузиться без переписывания всего моего проекта, были бы полезны.

В противном случае, если бы вы могли взвесить вариант 1 или 2, это также было бы полезно.

Разъяснение: асинхронный процесс будет состоять в том, чтобы отсканировать сторонний веб-сайт и отправить уведомление об уведомлении исходному запрашивающему. Сторонний веб-сайт немного ненадежный и медленный, поэтому он будет обрабатываться как асинхронный процесс (встроено несколько попыток повторных попыток). Я также буду извлекать файлы с этого сайта и хранить их в S3.

Ответы [ 2 ]

4 голосов
/ 31 января 2009

Ваша Кварцевая Работа не должна быть Сервлетом! Вы можете сохранить входящие задания в БД и запустить Quartz при запуске основного сервлета. Кварцевое задание может быть простым POJO и периодически проверять БД на наличие любых заданий.

Однако я бы посоветовал взглянуть на весну. Это не сложно для изучения и легко установить в Tomcat . Вы можете найти много полезной информации в справочной документации Spring . Он имеет интеграцию с кварцем, что гораздо проще, чем делать это вручную.

1 голос
/ 31 января 2009

Подходящее решение, которое не потребует от вас большого объема проектирования и программирования, - это создание объекта, который вам понадобится позже в сервлете, и сериализация его в байтовый массив. Затем поместите это в поле BLOB в базе данных и покончите с этим.

Тогда ваш поток обработки может просто прочитать содержимое, десериализовать его и работать с воскрешенным объектом.

Но вы можете получить более точные ответы, описав, что вам действительно нужно сделать для вашей системы:)

...