我有一个需要处理JMS消息(通过MDB)的方式,即属于某个组(设置了组ID)的消息被同一bean实例使用。我在这种情况下需要执行的行为是,具有相同组ID的消息将按顺序进行处理(尽管消息的顺序无关紧要),并且将它们绑定(bind)到相同的MDB实例应提供此功能。

这些消息不带有任何类型的序列号(因为它无关紧要),我们也不知道组中的第一条消息或最后一条消息是什么(从理论上讲,“永远”不可能是组中的最后一条消息)。我们希望在消费者能够收到它们后立即将它们交付。

ActiveMQ只需设置JMSXGroupID即可提供此确切功能(http://activemq.apache.org/message-groups.html)。但是,我们必须绑定(bind)到WebSphere MQ。到目前为止,我发现的所有内容是,可以收集队列中同一组的消息,并使用MessageSelector来接收http://www.ibm.com/developerworks/websphere/library/techarticles/0602_currie/0602_currie.html中描述的“组中的最后一个消息”消息。不过,我们更喜欢一种更清洁的方式(例如ActiveMQ中的方式)。有谁知道如何在WebSphere中实现该行为?

谢谢!

最佳答案

通常,您在JMS的IBM产品实现(WebSphere MQ和SIBus实现)中都使用MessageSelector。这些等效于过滤器,该过滤器将扫描HTTP或SOAP消息的 header 以查找基于Web的协议(protocol)。

尽管这可能不是您想要的,但实际上它是一个干净且经过深思熟虑的设计。

但是,如果您不想使用MessageSelector,则可能必须构建自己的消息,并使用前端MDB来“处理”消息,该MDB扫描 header ,然后将消息转发到适当的队列,其中只有关心的MDB关于分组消息的信息将对其进行处理(一种网关/消息选择器模式)。

如果使用的是“纯” JMS API,则可以要求Session对象使用要筛选的指定选择器字符串( header 中的值)创建一个MessageConsumer(同样,您必须自行设置)。

//assume we have created a JMS Connection and Session object already.
//and looked up the Queue we want already.
MessageConsumer consumerWithSelector = session.createConsumer(queue, groupId);

这就是纯JMS API所提供的。其他任何事情都完全取决于消息传递技术的实现者,而消息传递技术的实现者则专有于其实现,而不是可移植的代码。

10-07 19:11
查看更多