独占消费者
背景
我们维护消息在队列中的顺序,并按顺序将它们分派给消费者。但是,如果您有多个 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);