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

Oracle AQ using JMS and JMSXGroupID does not result in 'sticky' consumers

Apache ActiveMQ Artemis 使用 JMSXGroupId 来实现 'sticky' 消费者会话。使用相同 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

Oracle AQ 和 Amazon SQS 没有表现出相同的 'sticky' 消费者行为。除了 JMSXGroupId 用于将相关消息组合在一起之外,我在 JMS 规范中找不到任何特定内容。

我的预期是所有 JMS 消费者在设置 JMSXGroupId 时都会表现出这种 'sticky' 行为,但情况似乎并非如此。

有没有人仅通过设置 JMSXGroupId 就成功地使用 Oracle AQ/SQS 实现了这种行为?或者 JMSXGroupId 的意图是允许 consumer 在出队时使用 selector?这似乎不像它需要在运行时识别的那样可以扩展,而 ActiveMQ 实现显然可以。

JMS规范只规定同组的消息要按顺序消费。它没有说明如何实现此功能。

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

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