Монитор запуска в провайдере 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