ActiveMQ Artemis JMS 共享订阅

问题描述

我有一个单节点 ActiveMQ 实例,其中有两个相互竞争的消费者连接到一个主题。根据 JMS 2.0 规范共享主题订阅。共享订阅确实保证只有其中一个订阅者(使用相同的订阅名称)才能收到消息。但是我注意到它并不能保证只有在确认第一个消息时才会传递第二个消息。如果第一个消费者需要时间来确认消息,则第二个消息甚至在消费者向代理发送第一个消息的确认之前就已交付给免费消费者。这是标准行为吗?有没有办法阻止经纪人在确认第一条消息之前传递第二条消息?

解决方法

ActiveMQ Artemis 允许 exclusive queues。它们是一种特殊的队列,一次将所有消息路由到一个消费者。 显然,独占队列有一个缺点,即您无法扩展消费者以提高消费,因为技术上只有一个消费者处于活动状态。

不过,我建议查看 message grouping 以扩展您的解决方案。当您希望某个属性值的所有消息都由同一个使用者串行处理,而不停止将具有不同属性值的消息传递给其他使用者时,消息组非常有用。