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