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