Монитор запуска в провайдере JMS, например, серии MQ

В Websphere MQ я могу настроить очередь для запуска приложения при получении сообщения.
Таким образом, у меня может быть приложение, которое запускается только при необходимости, и мне не нужно управлять одним демоном, который ожидает сообщения в этой очереди.
Больше информации о здесь

Есть ли поставщик JMS с открытым исходным кодом, который предоставляет эту функциональность?

Я пробовал ActiveMQ, но у него нет триггеров.

1 ответ

Решение

У qpid нет функции запуска монитора, подобной websphere-MQ. Я знаю, что ActiveMQ тоже нет, и я подозреваю, что это может быть верно и для других провайдеров JMS. Тем не менее, можно развернуть свой собственный монитор-триггер.

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


Чтобы реализовать триггер монитора в qpid:

Спецификация JMS определяет режим асинхронной доставки. Смотрите раздел 4.5.2. Так что вы должны быть в состоянии сделать это с любым провайдером JMS. Асинхронный слушатель реализует javax.jms.MessageListener интерфейс. Метод onMessage() должен быть реализован и служит функцией обратного вызова, когда любое новое сообщение появляется в очереди, на которую оно подписано.

Предположим, что основная очередь приложений mainQ, Вы создаете новый MessageListener за mainQ в режиме просмотра - чтобы фактически не потреблять сообщения от mainQ

Destination mainQ = (Destination) session.createQueue("mainQ; {mode: browse}");
MessageConsumer mainQConsumer = session.createConsumer(mainQ);
mainQConsumer.setMessageListener(this);

в onMessage() Функция вы можете создать новое сообщение в отдельном triggerQ или вы можете пропустить этот шаг и получить право на запуск приложения.

public void onMessage(Message message)
{
  TextMessage triggerMessage = session.createTextMessage("Trigger-start-Application-X");

  Destination triggerQ = (Destination) session.createQueue("triggerQ");
  triggerQProducer = session.createProducer(triggerQ);
  this.triggerQProducer.send(triggerMessage);

  // Or alternatively:
  // if (!applicationIsActive()) activateApplication()
}

Смотрите полный рабочий образец здесь: https://github.com/foragerr/qpid-trigger-demo

Другие вопросы по тегам