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

时间:2015-04-27 10:57:31

标签: jms qpid jboss-messaging openjms sonicmq

在Websphere MQ中,我可以配置队列以在消息到达时触发应用程序 通过这种方式,我可以拥有一个只在需要时启动的应用程序,而且我不需要管理一个等待该队列中的消息的守护进程。
有关here

的更多信息

是否有一个带有此功能的开源JMS提供程序?

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

1 个答案:

答案 0 :(得分:1)

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

自制的监视器触发器将成为您必须管理的应用程序进程(虽然轻巧轻量级),您最好还是管理实际的应用程序线程吗?

在qpid中实现监视器触发器:

JMS规范定义了asynchronous delivery mode. See section 4.5.2。因此,您应该可以使用任何JMS提供程序执行此操作。 asynchronous listener实现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