对于最新的稳定版本,请使用 Spring AMQP 3.2.0spring-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,您可以设置此项以控制事务中传送的消息数或减少确认数,但这可能会导致失败后重复传送的数量增加。 (DMLC 确实有messagesPerAck,您可以使用它来减少 ack,与batchSize和 SMLC 一起使用,但它不能与事务一起使用 — 每条消息都在单独的事务中传递和确认)。spring-doc.cadn.net.cn

  • consumerBatchEnabled:支持在使用者中对离散消息进行批处理;有关更多信息,请参阅 Message Listener Container Configuration (消息侦听器容器配置)。spring-doc.cadn.net.cn

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

但是,与 SMLC 相比,DMLC 具有以下优势:spring-doc.cadn.net.cn

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

  • 避免了 RabbitMQ Client 线程和使用者线程之间的上下文切换。spring-doc.cadn.net.cn

  • 线程在使用者之间共享,而不是为 SMLC 中的每个使用者提供专用线程。 但是,请参阅线程和异步使用者中有关连接工厂配置的重要说明。spring-doc.cadn.net.cn

有关哪些配置属性适用于每个容器的信息,请参阅消息侦听器容器配置spring-doc.cadn.net.cn