JMS提供程序(如MQ系列)中的触发器监视器

JMS提供程序(如MQ系列)中的触发器监视器,jms,qpid,jboss-messaging,openjms,sonicmq,Jms,Qpid,Jboss Messaging,Openjms,Sonicmq,在Websphere MQ中,我可以配置一个队列,以便在消息到达时触发应用程序。 这样,我就可以有一个只在需要时启动的应用程序,而不必管理一个在该队列中等待消息的守护进程。 更多关于 是否有开源JMS提供程序提供此功能 我尝试了ActiveMQ,但它没有触发器。qpid没有类似websphere MQ的监视器触发器功能。我知道ActiveMQ也不这样做,我怀疑其他JMS提供商也是如此。但是,您可以推出自己的监视器触发器 然后,自制监视器触发器将成为您必须管理的应用程序进程(尽管是轻量级的),但是

在Websphere MQ中,我可以配置一个队列,以便在消息到达时触发应用程序。
这样,我就可以有一个只在需要时启动的应用程序,而不必管理一个在该队列中等待消息的守护进程。
更多关于

是否有开源JMS提供程序提供此功能


我尝试了ActiveMQ,但它没有触发器。

qpid没有类似websphere MQ的监视器触发器功能。我知道ActiveMQ也不这样做,我怀疑其他JMS提供商也是如此。但是,您可以推出自己的监视器触发器

然后,自制监视器触发器将成为您必须管理的应用程序进程(尽管是轻量级的),但是,您管理实际应用程序线程本身会更好吗


要在qpid中实现监视器触发器,请执行以下操作: JMS规范定义了一个。因此,您应该能够使用任何JMS提供程序执行此操作。实现了
javax.jms.MessageListener
接口。需要实现方法
onMessage()
,并在订阅的队列中出现任何新消息时充当回调函数

假设主应用程序队列是
mainQ
。您可以在浏览模式下为
mainQ
创建一个新的
MessageListener
,这样就不会实际使用来自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()
}

请参阅此处的完整工作示例:

建议您标记您的问题,以便其他JMS提供商的专家看到它,因为您只为websphere MQ标记了它,并且您已经知道该问题的答案:-)@MoragHughson谢谢,我添加了那些已经存在的消息。当主队列中有消息时,websphere MQ不是只向触发器队列发送一条新消息吗?这与从“触发器”线程的onMessage方法启动真正的应用程序线程有何不同?onMessage是JMS的一部分,因此所有JMS客户机都实现了它。如果绝对必要,您甚至可以让触发器客户端在新队列中生成新的触发器消息。@是的,这似乎是可以接受的。你能试着解释一下吗?也许有一些参考资料?当消息到达并且myApplication仍在执行时,WMQ不会再次启动它,它假定用户应用程序使用队列中的所有消息包。我可以预期类似的行为吗?或者所有消息都称为“onMessage”?