对于最新稳定版本,请使用Spring AMQP 4.0.0spring-doc.cadn.net.cn

选择容器

2.0 版本引入了DirectMessageListenerContainer(DMLC)。 此前,只有SimpleMessageListenerContainer(SMLC)是可用的。 SMLC 为每个消费者使用内部队列和专用线程。 如果容器配置为监听多个队列,则使用同一个消费者线程处理所有队列。 并发控制由并发消费者以及其他财产。 当RabbitMQ客户端收到消息时,客户端线程会通过队列将其交给消费者线程。 这种架构是因为在早期版本的 RabbitMQ 客户端中,无法实现多个并发交付。 客户端的新版本采用了修订后的线程模型,现在可以支持并发。 这促成了DMLC的引入,即监听器现在直接在RabbitMQ客户端线程中调用。 因此,其架构实际上比SMLC更“简单”。 然而,这种方法存在一些局限性,SMLC的某些功能DMLC无法提供。 此外,并发控制由消费者按队列(以及客户端库的线程池)。 这并发消费者该容器无法提供相关属性。spring-doc.cadn.net.cn

以下功能适用于SMLC,但DMLC不包括:spring-doc.cadn.net.cn

  • 批量大小:通过SMLC,你可以设置它来控制事务中送达的消息数量或减少确认次数,但失败后可能会导致重复送达次数增加。 (DMLC确实有消息PerAck你可以用它来减少追号,原理与批量大小以及SMLC,但不能用于交易——每个消息在独立事务中送达和确认)。spring-doc.cadn.net.cn

  • consumerBatchEnabled:使消费者能够批量处理离散消息;更多信息请参见消息监听器容器配置spring-doc.cadn.net.cn

  • maxConcurrentConsumers以及消费者的缩放间隔或触发器——DMLC中没有自动缩放功能。 不过,它确实允许你在程序上更改消费者按队列财产和消费者都会相应调整。spring-doc.cadn.net.cn

然而,DMLC相较于SMLC具有以下优势:spring-doc.cadn.net.cn

  • 运行时添加和移除队列更高效。 使用SMLC,整个消费者线程会被重启(所有消费者被取消并重新创建)。 有了DMLC,未受影响的消费者不会被取消。spring-doc.cadn.net.cn

  • 避免了RabbitMQ客户端线程与消费者线程之间的上下文切换。spring-doc.cadn.net.cn

  • 线程是跨消费者共享的,而不是在SMLC中为每个消费者单独设置线程。 不过,请参见《线程与异步消费者》中关于连接工厂配置的重要说明。spring-doc.cadn.net.cn

请参阅消息监听器容器配置,了解每个容器适用哪些配置属性。spring-doc.cadn.net.cn