2011-10-27 179 views
7

我有一个需求,即需要通过属于某个组的消息(组ID设置)处理同一个bean实例来处理JMS消息(通过MDB)。我需要的行为是具有相同组ID的消息按顺序处理(尽管消息顺序无关紧要),并将它们绑定到相同的MDB实例应该提供该消息。WebSphere MQ中的消息组

这些消息没有任何类型的序列号(因为它是不相关的),我们不知道组中的第一条或最后一条消息是什么(可能从未“成为组中的最后一条消息” 。我们希望在消费者能够接收到它们时立即交付。

ActiveMQ通过简单地设置JMSXGroupID提供了这个确切的功能(http://activemq.apache.org/message-groups.html)。尽管如此,我们必然会遇到WebSphere MQ。我迄今发现的所有情况都是可以收集队列中同一组的消息,并使用MessageSelector接收http://www.ibm.com/developerworks/websphere/library/techarticles/0602_currie/0602_currie.html中描述的“组中的最后消息”消息。我们宁愿采用更清晰的方式(比如在ActiveMQ中)。有谁知道如何在WebSphere中实现这种行为?

谢谢!

回答

2

通常在IBM产品实现中使用MessageSelectors(包括WebSphere MQ和SIBus实现)。这些相当于一个筛选器,它可以扫描基于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给你的。其他任何东西都完全取决于消息传递技术的实现者,消息传递技术然后专用于其实现而不是便携式代码。

+0

谢谢,这就是我的预期。 – ftr

相关问题