此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring AMQP 3.2.6! |
选择容器
2.0 版引入了DirectMessageListenerContainer
(DMLC)。
以前,只有SimpleMessageListenerContainer
(SMLC) 可用。
SMLC 为每个使用者使用内部队列和专用线程。
如果将容器配置为侦听多个队列,则使用同一个使用者线程来处理所有队列。
并发由concurrentConsumers
和其他属性。
当消息从 RabbitMQ 客户端到达时,客户端线程通过队列将它们移交给使用者线程。
需要这种架构,因为在早期版本的 RabbitMQ 客户端中,无法进行多个并发交付。
较新版本的客户端具有修订的线程模型,现在可以支持并发。
这允许引入 DMLC,其中侦听器现在直接在 RabbitMQ 客户端线程上调用。
因此,它的架构实际上比 SMLC “更简单”。
但是,这种方法存在一些局限性,并且 SMLC 的某些功能不适用于 DMLC。
此外,并发由consumersPerQueue
(以及客户端库的线程池)。
这concurrentConsumers
和关联的属性不适用于此容器。
SMLC 提供以下功能,但 DMLC 不提供:
-
batchSize
:使用 SMLC,您可以设置此设置以控制事务中传递的消息数或减少 ack 数,但这可能会导致失败后重复传递的数量增加。 (DMLC 确实有messagesPerAck
,您可以使用它来减少 acks,与batchSize
和 SMLC,但它不能与事务一起使用——每条消息都在单独的事务中传递和确认)。 -
consumerBatchEnabled
:启用消费者中离散消息的批处理;有关更多信息,请参阅消息侦听器容器配置。 -
maxConcurrentConsumers
和消费者扩展间隔或触发器——DMLC 中没有自动扩展。 但是,它确实允许您以编程方式更改consumersPerQueue
财产和消费者都相应地进行了调整。
但是,与 SMLC 相比,DMLC 具有以下优势:
-
在运行时添加和删除队列效率更高。 使用 SMLC,将重新启动整个使用者线程(取消并重新创建所有使用者)。 使用 DMLC,未受影响的消费者不会被取消。
-
避免了 RabbitMQ 客户端线程和消费者线程之间的上下文切换。
-
线程在使用者之间共享,而不是为 SMLC 中的每个使用者提供专用线程。 但是,请参阅线程和异步使用者中有关连接工厂配置的重要说明。
有关哪些配置属性适用于每个容器的信息,请参阅消息侦听器容器配置。