2009-02-05 3 views
7

Мне сложно понять, как архитектовать последнюю часть моей системы. В настоящее время я запускаю сервер Tomcat, у которого есть сервлет, который отвечает на запросы клиентов. Каждый запрос, в свою очередь, добавляет сообщение обработки в асинхронную очередь (я, вероятно, буду использовать JMS через Spring или, скорее, Amazon SQS).Каков наилучший способ непрерывной обработки асинхронной очереди в Java?

Последовательность событий такова:

отправляющая сторона:
1. Принять запрос клиента
2. Добавьте некоторые данные в БД, связанные с этим запросом с уникальным ID
3. Добавить объект сообщения, представляющий этот запрос в очередь сообщений

приемной стороне:
1. натянуть новый объект сообщения из очереди
2. Unwrap объект и захват некоторая информация с веб-сайта на основе информации, содержащейся в объекте msg.
3. Отправить оповещение по электронной почте
4. обновите мою строку БД (тот же уникальный идентификатор) с информацией, что операция была выполнена для этого запроса.

У меня есть трудное выяснение того, как правильно обращаться с принимающей стороной. С одной стороны, я могу создать простую java-программу, которую я запускаю из командной строки, которая выбирает каждый элемент в очереди и обрабатывает его. Это безопасно? Имеет ли смысл использовать эту программу в качестве другого потока внутри контейнера Tomcat? Я не хочу делать это последовательно, то есть принимающая сторона должна обрабатывать несколько объектов одновременно - используя несколько потоков. Я хочу, чтобы это всегда работало 24 часа в сутки.

Каковы некоторые варианты построения принимающей стороны?

+0

Если кто-то заинтересован в том, что я, наконец, закончил делать. Я использовал SQS от Amazon и имел java-клиент (использует Spring Framework), который опросил очередь. Когда он находит msg, он обрабатывает его и возвращается в состояние ожидания. Я мог бы добавить Quartz threading, теперь я просто запускаю несколько процессов. – Ish

+0

Я столкнулся с аналогичной проблемой. Я хотел бы знать, как реализован Java-клиент. Надеюсь, он не работает в бесконечном цикле и пулах для сообщения? –

ответ

3

«С одной стороны, я могу создать простую java-программу, которую я запускаю из командной строки, которая выбирает каждый элемент в очереди и обрабатывает его. Это безопасно?»

Что небезопасно? Он отлично работает.

«Имеет ли смысл использовать эту программу в качестве другого потока внутри контейнера Tomcat?»

Только если у Tomcat есть много свободного времени для обработки фоновой обработки. Часто это является случае - у вас есть свободное время для обработки.

Однако нити не являются оптимальными. В потоках используются общие ресурсы ввода-вывода, а фоновый поток может замедлить работу интерфейса.

Лучше иметь очередь JMS между интерфейсом «порт 80» и отдельным фоновым процессом. Начальный процесс запускается, подключается к очереди, выбирает и выполняет запросы. Бэкэнд-процесс может (при необходимости) быть многопоточным.

0

Я сделал это, разместив приемник на сервере приложений, weblogic в моем случае, но tomcat отлично работает. Не проводите опрос в очереди, используйте модель на основе событий. Это может быть ручной код или это может быть веб-служба, управляемая сообщениями. Если обновление базы данных является идемпотентным, вы можете обновить базу данных и отправить электронное письмо, а затем выдать фиксацию в очереди. Не проблема иметь несколько потоков, которые все читают из одной очереди.

Я использую различные решения JMS, в том числе tibco, activemq (до того, как Apache включил его) и joram. Joram был более надежным решением для открытых источников, но теперь он может измениться, когда он является частью Apache.

+0

Можете ли вы объяснить, как реализовать модель на основе событий? –

+0

Просмотрите http://docs.oracle.com/cd/E13222_01/wls/docs90/jms/implement.html#1188496 раздел «Получение сообщений асинхронно». –

1

Если вы уже используете Spring, ознакомьтесь с DefaultMessageListenerContainer. Это позволяет вам создавать обработанный POJO-компонент. Это можно использовать из существующего контейнера приложения (вашего файла WAR) или в виде отдельного процесса.

+0

В этом случае пользователь постоянно прогоняет очередь или как-нибудь получает уведомление? – Ish

+0

Я уверен, что опросы DefaultMessageListenerContainer. Самое приятное в том, что он скрывает проблему опроса/уведомления от вас. Вы просто реализуете jms MessageListener и выполняете любую работу, которую вам нужно выполнить. –

2

Если вы используете JMS, почему вы ставите задачи в БД?

Вы можете использовать простую очередь в JMS. Это будет держать задачи, даже если брокер JMS умрет, пока они не будут признаны. Вы можете иметь избыточных брокеров, чтобы, если один брокер умрет, второй автоматически берет верх. Это может быть более надежным, чем использование одного БД.

+0

Потому что я получаю некоторую информацию с целевого веб-сайта и размещаю ее рядом со строкой в ​​БД. Затем эта информация должна быть восстановлена ​​клиентом в более поздний момент времени. Я не использую db для избыточности, а также для хранения данных для последующего извлечения. – Ish

Смежные вопросы