В JMS есть очереди и темы. Насколько я понимаю, до сих пор очереди лучше всего используются для сценариев производителей/потребителей, где темы могут использоваться для публикации/подписки. Однако в моем сценарии мне нужен способ объединить оба подхода и создать архитектуру производителя-потребителя-наблюдателя.JMS Producer-Consumer-Observer (PCO)
В частности, у меня есть продюсеры, которые пишут в очередь и рабочие, которые читают из этих очередей и обрабатывают сообщения в этих очередях, а затем записывают их в другую очередь (или тему). Всякий раз, когда работник выполнял работу, мой графический интерфейс должен быть уведомлен и обновлять его представление текущего состояния системы. Поскольку рабочие и графические интерфейсы - это разные процессы, я не могу применить простой шаблон наблюдателя или напрямую сообщить об этом графическому интерфейсу.
Каков наилучший способ реализовать это, используя комбинацию очередей и/или тем? GUI всегда должен быть уведомлен, но он никогда не должен потреблять что-либо из очереди?
Я хотел бы решить это с помощью JMS напрямую и не использовать никаких дополнительных технологий, таких как RMI, для реализации части наблюдателя.
Чтобы дать более конкретный пример:
- У меня есть очередь с пакетами (
PACKAGEQUEUE
), производимую машиной (PackageProducer
) - Я работник, который принимает пакет из
PACKAGEQUEUE
добавляет адрес и затем записывает его вMAILQUEUE
(AddressWorker
) - Другой рабочий обрабатывает
MAILQUEUE
и отправляет пакеты по почте (MailWorker
). - После шага 2. когда сообщение записывается в
MAILQUEUE
, я хочу уведомить об этом графический интерфейс и обновить статус пакета. Разумеется, графический интерфейс не должен потреблять сообщения вMAILQUEUE
, только их следует использовать толькоMailWorker
.
Спасибо, еще один вопрос: всегда ли это необходимо использовать комбинацию очереди и тему или можно, например, изменить 'MAILQUEUE' в' MAILTOPIC', а затем подписываются как GUI и MailWorker ? Есть ли какие-либо последствия, которые я сейчас не вижу? – lanoxx
Не нужно. Вы можете использовать тему вместо очереди, и оба графического интерфейса и MailWorker подписываются на эту тему. В вашем решении MailWorker обработает сообщение, в то время как GUI просто просмотрит сообщение. MailWorker должен создать долговременную подписку, поскольку он не должен пропускать публикации, даже если он не работает. Для GUI вы можете выбрать тип подписки. – Shashi
Я вижу, поэтому уловка заключается в том, что если я подпишу и GUI и Worker в одну тему, а одна из них не будет запущена, сообщение будет потеряно. Хотя с отдельной темой и очередью этого не происходит. Правильно? – lanoxx