此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring AMQP 3.2.6spring-doc.cadn.net.cn

选择容器

2.0 版引入了DirectMessageListenerContainer(DMLC)。 以前,只有SimpleMessageListenerContainer(SMLC) 可用。 SMLC 为每个使用者使用内部队列和专用线程。 如果将容器配置为侦听多个队列,则使用同一个使用者线程来处理所有队列。 并发由concurrentConsumers和其他属性。 当消息从 RabbitMQ 客户端到达时,客户端线程通过队列将它们移交给使用者线程。 需要这种架构,因为在早期版本的 RabbitMQ 客户端中,无法进行多个并发交付。 较新版本的客户端具有修订的线程模型,现在可以支持并发。 这允许引入 DMLC,其中侦听器现在直接在 RabbitMQ 客户端线程上调用。 因此,它的架构实际上比 SMLC “更简单”。 但是,这种方法存在一些局限性,并且 SMLC 的某些功能不适用于 DMLC。 此外,并发由consumersPerQueue(以及客户端库的线程池)。 这concurrentConsumers和关联的属性不适用于此容器。spring-doc.cadn.net.cn

SMLC 提供以下功能,但 DMLC 不提供:spring-doc.cadn.net.cn

  • batchSize:使用 SMLC,您可以设置此设置以控制事务中传递的消息数或减少 ack 数,但这可能会导致失败后重复传递的数量增加。 (DMLC 确实有messagesPerAck,您可以使用它来减少 acks,与batchSize和 SMLC,但它不能与事务一起使用——每条消息都在单独的事务中传递和确认)。spring-doc.cadn.net.cn

  • consumerBatchEnabled:启用消费者中离散消息的批处理;有关更多信息,请参阅消息侦听器容器配置spring-doc.cadn.net.cn

  • maxConcurrentConsumers和消费者扩展间隔或触发器——DMLC 中没有自动扩展。 但是,它确实允许您以编程方式更改consumersPerQueue财产和消费者都相应地进行了调整。spring-doc.cadn.net.cn

但是,与 SMLC 相比,DMLC 具有以下优势: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