WebSphere MQ 中的消息组

2024-01-07

我有一个要求,我需要以属于某个组(设置组 ID)的消息由同一 bean 实例使用的方式处理 JMS 消息(通过 MDB)。我在此需要的行为是按顺序处理具有相同组 ID 的消息(尽管消息顺序无关),并且将它们绑定到相同的 MDB 实例应该可以提供这一点。

这些消息不携带任何类型的序列号(因为它是不相关的),并且我们不知道组中的第一条或最后一条消息是什么(理论上“永远不会”存在组中的最后一条消息)。我们希望消费者能够收到后立即交付。

ActiveMQ 提供了这个确切的功能(http://activemq.apache.org/message-groups.html http://activemq.apache.org/message-groups.html)通过简单地设置 JMSXGroupID 即可。不过,我们必须使用 WebSphere MQ。到目前为止我发现的是,可以收集队列中同一组的消息,并使用 MessageSelector 接收“组中的最后一条消息”消息,如中所述http://www.ibm.com/developerworks/websphere/library/techarticles/0602_currie/0602_currie.html http://www.ibm.com/developerworks/websphere/library/techarticles/0602_currie/0602_currie.html。不过,我们更喜欢一种更干净的方式(就像在 ActiveMQ 中)。有谁知道如何在 WebSphere 中实现这种行为?

Thanks!


通常,您在 JMS 的 IBM 产品实现(WebSphere MQ 和 SIBus 实现)中使用 MessageSelector。它们相当于一个过滤器,可以扫描 HTTP 或 SOAP 消息的标头以查找基于 Web 的协议。

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

但是,如果您不想使用 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 为您提供的全部内容。其他任何事情都完全取决于消息传递技术的实现者,该技术是其实现所专有的,而不是可移植代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSphere MQ 中的消息组 的相关文章

随机推荐