Как приостановить подписку на тему JMS от получения сообщений - PullRequest
0 голосов
/ 11 августа 2009

Моя настройка: JBoss Messaging 1.4 работает на JBoss 4.2.3

У меня есть несколько MDB, которые подписываются на одну тему, и onMessage () MDB пытается доставить полученное сообщение одному веб-сервису.

Моя проблема в том, что я не могу понять, как приостановить подписки в случае, когда веб-служба отключена.

Мой план состоит в следующем в onMessage ():

  1. попробуйте доставить на веб-сервис
  2. если не в сети:
  3. -> приостановить подписку
  4. -> сгенерировать исключение в onMessage (), чтобы JMS повторно доставил сообщение пока веб-сервис снова не подключится к сети
  5. -> начать подписку

Я хочу приостановить ТОЛЬКО одну подписку, в которой возникла проблема - НЕ все мои подписчики.

Есть предложения, как это решить?

Ответы [ 3 ]

1 голос
/ 11 августа 2009

Почему вы хотите приостановить подписку? Просто бросьте исключение и идите спать, скажем, на 30 секунд. Исключение откатит транзакцию JMS и поместит сообщение обратно в очередь.

Спящий режим гарантирует, что это не станет DoS-атакой, пока веб-служба находится в автономном режиме (путем доставки и отката сообщения много раз в секунду).

[РЕДАКТИРОВАТЬ] Если у вас много слушателей на одну и ту же тему (по соображениям производительности), я предлагаю создать независимый процесс, который прослушивает сообщения «Web service down» и отписывает всех обычных слушателей в этом случае.

Затем процесс должен подождать, пока сервис снова не станет доступен, и повторно подписать слушателей.

0 голосов
/ 14 августа 2009

Это очень похоже на сценарий в Как временно отключить прослушиватель сообщений

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

0 голосов
/ 11 августа 2009

Не можете ли вы остановить слушателя, который прослушивает входящие сообщения в теме?

Вот ссылка на документ Слушателя, и у него есть метод паузы. Вы можете следовать тому же подходу, а подробности можно найти в их распространении. http://synapse.apache.org/apidocs/org/apache/synapse/transport/jms/JMSListener.html

Еще один пример того, как остановить вашего потребителя: http://livedocs.adobe.com/blazeds/1/javadoc/flex/messaging/services/messaging/adapters/JMSConsumer.html#stop()

Все они в основном одинаковы.

...