1

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

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

我试过 ActiveMQ 但它没有触发。

4

1 回答 1

1

qpid 没有类似 websphere-MQ 的监视器触发功能。我知道 ActiveMQ 也没有,而且我怀疑其他 JMS 提供程序也可能是这样。但是,可以推出自己的监视器触发器。

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


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

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

于 2015-04-30T09:53:28.203 回答