2012-05-10 4 views
0

В JMS есть очереди и темы. Насколько я понимаю, до сих пор очереди лучше всего используются для сценариев производителей/потребителей, где темы могут использоваться для публикации/подписки. Однако в моем сценарии мне нужен способ объединить оба подхода и создать архитектуру производителя-потребителя-наблюдателя.JMS Producer-Consumer-Observer (PCO)

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

Каков наилучший способ реализовать это, используя комбинацию очередей и/или тем? GUI всегда должен быть уведомлен, но он никогда не должен потреблять что-либо из очереди?

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

Чтобы дать более конкретный пример:

  1. У меня есть очередь с пакетами (PACKAGEQUEUE), производимую машиной (PackageProducer)
  2. Я работник, который принимает пакет из PACKAGEQUEUE добавляет адрес и затем записывает его в MAILQUEUE (AddressWorker)
  3. Другой рабочий обрабатывает MAILQUEUE и отправляет пакеты по почте (MailWorker).
  4. После шага 2. когда сообщение записывается в MAILQUEUE, я хочу уведомить об этом графический интерфейс и обновить статус пакета. Разумеется, графический интерфейс не должен потреблять сообщения в MAILQUEUE, только их следует использовать только MailWorker.

ответ

1

Вы можете использовать комбинацию из очереди и темы для своего решения.

Ваше приложение для графического интерфейса пользователя может подписаться на тему, скажем MAILQUEUE_NOTIFICATION. Каждый раз (т. Е. На шаге 2) PackageProducer пишет сообщение MAILQUEUE, копия этого сообщения должна быть опубликована до MAILQUEUE_NOTIFICATION. Поскольку приложение GUI подписалось на эту тему, оно получит эту публикацию, содержащую информацию о статусе пакета. GUI может быть обновлен с содержанием этой публикации.

НТН

+0

Спасибо, еще один вопрос: всегда ли это необходимо использовать комбинацию очереди и тему или можно, например, изменить 'MAILQUEUE' в' MAILTOPIC', а затем подписываются как GUI и MailWorker ? Есть ли какие-либо последствия, которые я сейчас не вижу? – lanoxx

+0

Не нужно. Вы можете использовать тему вместо очереди, и оба графического интерфейса и MailWorker подписываются на эту тему. В вашем решении MailWorker обработает сообщение, в то время как GUI просто просмотрит сообщение. MailWorker должен создать долговременную подписку, поскольку он не должен пропускать публикации, даже если он не работает. Для GUI вы можете выбрать тип подписки. – Shashi

+0

Я вижу, поэтому уловка заключается в том, что если я подпишу и GUI и Worker в одну тему, а одна из них не будет запущена, сообщение будет потеряно. Хотя с отдельной темой и очередью этого не происходит. Правильно? – lanoxx

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