独占消费者

功能 > 消费者功能 > 独占消费者

背景

我们维护消息在队列中的顺序,并按顺序将它们分派给消费者。但是,如果您有多个 JMS 会话和 MessageConsumer 实例从同一个队列消费(无论是在同一个 JVM 中还是不在同一个 JVM 中),您将失去按顺序处理消息的保证;因为消息将在不同的线程中并发处理。

有时,保证消息处理顺序很重要。例如,您不希望在完成插入操作之前处理订单更新;或者倒退时间,用旧的更新覆盖较新的订单更新等。

因此,在 J2EE 集群中,人们通常需要将集群中的一个特定 JVM 固定 以在队列上拥有一个消费者,以避免丢失顺序。这样做的问题是,如果特定的固定 JVM 出现故障,将不再有人处理队列,这可能会成为问题。

独占消费者

我们在 4.x 中有一个名为独占消费者或独占队列的新功能,可以避免最终用户固定任何内容。代理将选择一个单一的 MessageConsumer 来接收队列的所有消息,以确保排序。如果该消费者出现故障,代理将自动故障转移并选择另一个消费者。

因此,其效果是一个异构的 J2EE 集群,其中每个 JVM 都具有相同的设置和配置;代理选择一个消费者作为消费者,并将所有消息按顺序发送给它,直到它死亡;然后您将获得立即故障转移到另一个消费者。

对于那些在 J2EE 集群中苦于固定 JMS 消费者的人来说,您会立即意识到这对于构建集群化的、高可用性的分布式服务是多么有用。

示例

独占消费者是使用 目标选项 创建的,如下所示

queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true");
consumer = session.createConsumer(queue);

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛徽标和 Apache ActiveMQ 项目徽标是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 许可。