选择容器

版本 2.0 引入了 `DirectMessageListenerContainer` (DMLC)。之前,只有 `SimpleMessageListenerContainer` (SMLC) 可用。SMLC 使用内部队列,并为每个消费者分配一个专用线程。如果容器配置为监听多个队列,则使用同一个消费者线程来处理所有队列。并发性由 `concurrentConsumers` 和其他属性控制。当消息从 RabbitMQ 客户端到达时,客户端线程通过队列将消息传递给消费者线程。这种架构是必要的,因为在早期版本的 RabbitMQ 客户端中,不支持多个并发传递。较新版本的客户端具有改进的线程模型,现在可以支持并发。这使得 DMLC 的引入成为可能,在 DMLC 中,监听器现在直接在 RabbitMQ 客户端线程上被调用。因此,它的架构实际上比 SMLC 更“简单”。但是,这种方法有一些限制,SMLC 的某些功能在 DMLC 中不可用。此外,并发性由 `consumersPerQueue`(以及客户端库的线程池)控制。`concurrentConsumers` 和相关属性在此容器中不可用。

以下功能在 SMLC 中可用,但在 DMLC 中不可用

  • batchSize:使用 SMLC,您可以设置此属性来控制事务中传递的消息数量或减少确认次数,但这可能会导致失败后重复传递的数量增加。(DMLC 确实有 `messagesPerAck`,您可以使用它来减少确认次数,与 SMLC 中的 `batchSize` 相同,但它不能与事务一起使用——每条消息都在单独的事务中传递和确认)。

  • consumerBatchEnabled:启用消费者中离散消息的批处理;有关更多信息,请参阅 消息监听器容器配置

  • maxConcurrentConsumers 和消费者缩放间隔或触发器——DMLC 中没有自动缩放。但是,它允许您以编程方式更改 `consumersPerQueue` 属性,并且消费者会相应地调整。

但是,与 SMLC 相比,DMLC 具有以下优势

  • 在运行时添加和删除队列效率更高。使用 SMLC,整个消费者线程将重新启动(所有消费者都被取消并重新创建)。使用 DMLC,不受影响的消费者不会被取消。

  • 避免了 RabbitMQ 客户端线程和消费者线程之间的上下文切换。

  • 线程在消费者之间共享,而不是像 SMLC 中那样为每个消费者分配一个专用线程。但是,请参阅 线程和异步消费者 中关于连接工厂配置的重要说明。

有关哪些配置属性适用于每个容器的信息,请参见消息侦听器容器配置