在 Websphere MQ 中,我可以配置一个队列以在消息到达时触发应用程序。
这样,我可以拥有一个仅在需要时启动的应用程序,并且我不必管理一个等待该队列中消息的守护程序。关于这里的
更多信息
是否有提供此功能的开源 JMS 提供程序?
我试过 ActiveMQ 但它没有触发。
qpid 没有类似 websphere-MQ 的监视器触发功能。我知道 ActiveMQ 也没有,而且我怀疑其他 JMS 提供程序也可能是这样。但是,可以推出自己的监视器触发器。
然后,自制监视器触发器将成为您必须管理的应用程序进程(尽管是轻量级的),您最好管理实际的应用程序线程本身吗?
JMS 规范定义了一种异步交付模式。请参阅第 4.5.2 节。因此,您应该能够使用任何 JMS 提供程序来执行此操作。异步侦听器实现该javax.jms.MessageListener
接口。该方法onMessage()
需要实现,并在其订阅的队列中出现任何新消息时用作回调函数。
假设主应用程序队列是mainQ
. 您在浏览模式下创建一个新MessageListener
的 for 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