问题描述
我目前面临一个用例,我需要并行处理多条消息,但相关消息一次只能由一个 JMS 使用者处理。
例如,考虑消息 ABCDEF 和 DEFGHI,后跟序列号:
- ABCDEF-1
- ABCDEF-2
- ABCDEF-3
- DEFGHI-1
- DEFGHI-2
- DEFGHI-3
如果可能,我希望 JMS 消费者并行处理 ABCDEF 和 DEFGHI 消息,但绝不要在两个或多个消费者之间同时处理两个 ABCDEF 或 DEFGHI 消息。在我的用例中,消息的顺序无关紧要。 我无法使用 JMS 过滤器,因为我不会提前知道组名,而且拥有组名的静态列表是不可行的。。消息是通过一个不受我控制的系统发送的,组名总是由 6 个字母组成。
ActiveMQ 似乎通过其 message groups 特性实现了这一点,但我在 IBM MQ 中找不到等效的功能。我的理解是这种行为是由 JMSXGroupId 和 JMSXGroupSeq 标头驱动的,它们仅在 JMS 规范的可选部分中定义。
作为一种变通方法,我总是可以有一个集结地(可能是一个数据库),在那里放置所有消息,然后对该数据库进行快速轮询,但在这里添加额外的基础设施似乎有点过分。此外,它也不允许我使用 JMS 事务在发生故障时进行重新处理。
对我来说,这似乎是消息传递架构中的一个常见用例,但我在网上的任何地方都找不到简单的是/否答案,而且 IBM MQ 文档也不太清楚是否支持此功能。
提前致谢
解决方法
IBM MQ 也有消息组的概念。
IBM MQ 消息头,称为消息描述符 (MQMD),其中包含几个字段,JMS 组字段映射到这些字段:-
- JMSXGroupID -> MQMD GroupID 字段
- JMSXGroupSeq -> MQMD MsgSeqNumber 字段
在此处阅读更多内容