|
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 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 中没有自动扩展。 但是,它确实允许您以编程方式更改consumersPerQueueproperty 和消费者进行相应的调整。
但是,与 SMLC 相比,DMLC 具有以下优势:
-
在运行时添加和删除队列效率更高。 使用 SMLC 时,将重新启动整个使用者线程(取消并重新创建所有使用者)。 使用 DMLC 时,不会取消不受影响的使用者。
-
避免了 RabbitMQ Client 线程和使用者线程之间的上下文切换。
-
线程在使用者之间共享,而不是为 SMLC 中的每个使用者提供专用线程。 但是,请参阅线程和异步使用者中有关连接工厂配置的重要说明。
有关哪些配置属性适用于每个容器的信息,请参阅消息侦听器容器配置。