使用 JMS 和 JMSXGroupID 的 Oracle AQ 不会产生'sticky'消费者



Apache ActiveMQ Artemis使用JMSXGroupId来实现"粘性"消费者会话。使用相同JMSXGroupId排队的消息被发送到相同的消费者,在FIFO中,单线程。然而,这确实允许多个线程同时处理唯一的JMSXGroupId组——这是完美的——见下文:

16:46:42.451 [Thread-4] INFO Log - This is Message 30 In JMSXGroup: Group C | To Thread Thread-4
16:46:42.451 [Thread-3] INFO Log - This is Message 283 In JMSXGroup: Group B | To Thread Thread-3
16:46:42.451 [Thread-3] INFO Log - This is Message 284 In JMSXGroup: Group B | To Thread Thread-3
16:46:42.451 [Thread-4] INFO Log - This is Message 31 In JMSXGroup: Group C | To Thread Thread-4
16:46:42.452 [Thread-4] INFO Log - This is Message 32 In JMSXGroup: Group C | To Thread Thread-4
16:46:42.452 [Thread-3] INFO Log - This is Message 285 In JMSXGroup: Group B | To Thread Thread-3

甲骨文AQ和亚马逊SQS并没有表现出同样的"粘性"消费者行为。除了JMSXGroupId用于将相关消息分组在一起之外,我在JMS规范中找不到任何特定的内容。

我的预期是,当设置JMSXGroupId时,所有JMS消费者都会表现出这种"粘性"行为,但事实并非如此。

是否有人仅通过设置JMSXGroupId就成功地使用Oracle AQ/SQS实现了这种行为?还是JMSXGroupId的意图是允许consumer在出队时使用selector?这似乎不会像在运行时所需的那样进行扩展,而ActiveMQ实现显然是这样。

JMS规范仅规定应按顺序使用同一组中的消息。它没有说明应该如何实现这个功能。

ActiveMQ Artemis通过将同一组中的所有消息分派给单个消费者(即您所称的"粘性"消费者(来实现消息分组。但是,其他JMS提供程序可以自由地以其他方式实现此功能。

如前所述,唯一的要求是按顺序使用同一组中的消息。如果您已经在Oracle AQ和Amazon SQS上测试了此功能,并且有证据表明同一组中的消息不是按顺序使用的,那么您应该联系这些提供商以获得支持。如果最终结果相同,那么简单地说它们的实现与ActiveMQ Artemis不同是无效的。

最新更新