WebSphere MQ中的消息组

7
我有一个需求,需要以某种方式处理JMS消息(通过MDB),使属于特定组的消息(设置了组ID)由同一Bean实例消耗。我需要的行为是,具有相同组ID的消息按顺序处理(尽管消息排序是无关紧要的),将它们绑定到同一MDB实例应该提供这个功能。
这些消息不携带任何类型的序列号(因为这是无关紧要的),我们不知道组中第一个或最后一个消息是什么(在理论上,可能永远不会有最后一个消息)。我们希望它们能够尽快被传递给消费者。
ActiveMQ提供了这个功能(http://activemq.apache.org/message-groups.html),只需设置JMSXGroupID即可。然而,我们受限于WebSphere MQ。到目前为止,我所找到的是可以在队列中收集同一组的消息,并使用MessageSelector接收“组中最后一个消息”(如http://www.ibm.com/developerworks/websphere/library/techarticles/0602_currie/0602_currie.html所述)。我们希望有更简洁的方式(像ActiveMQ一样)。是否有人知道如何在WebSphere中实现这种行为呢?
谢谢!
1个回答

2

通常在IBM产品实现的JMS(包括WebSphere MQ和SIBus的实现)中使用MessageSelectors。这相当于对基于Web的协议(如HTTP或SOAP消息)的头部进行扫描的过滤器。

虽然这可能不是您想要的,但它实际上是一个清晰且经过深思熟虑的设计。

然而,如果您不想使用MessageSelectors,则可能需要构建自己的消息处理器(MDB),该处理器扫描标头,然后将消息转发到适当的队列,在那里只有关心分组消息的MDB会处理它们(这类似于网关/消息选择器模式)。

如果您正在使用“纯”JMS API,则可以请求Session对象使用指定的选择器字符串(在头文件中的值)创建一个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所能提供的。其他任何功能都完全取决于消息传递技术的实现者,这些功能因此属于他们的专有实现,而不是可移植的代码。

谢谢,这正是我所期望的。 - ftr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接