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