选择容器

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

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

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

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

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

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

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

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

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

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