SimpleMessageListenerContainer

默认情况下,侦听器容器启动一个从队列接收消息的使用者。Spring中文文档

在检查上一节中的表时,您可以看到许多控制并发性的属性和属性。 最简单的方法是 ,它创建并发处理消息的(固定)数量的使用者。concurrentConsumersSpring中文文档

在版本 1.3.0 之前,这是唯一可用的设置,必须停止并重新启动容器才能更改设置。Spring中文文档

从版本 1.3.0 开始,您现在可以动态调整属性。 如果在容器运行时更改了它,则会根据需要添加或删除使用者以适应新设置。concurrentConsumersSpring中文文档

此外,还添加了一个名为 的新属性,容器会根据工作负载动态调整并发性。 这与四个附加属性结合使用:、、 和 。 使用默认设置时,增加使用者的算法工作方式如下:maxConcurrentConsumersconsecutiveActiveTriggerstartConsumerMinIntervalconsecutiveIdleTriggerstopConsumerMinIntervalSpring中文文档

如果尚未达到 ,并且现有使用者连续 10 个周期处于活动状态,并且自上次使用者启动以来至少经过了 10 秒,则启动新使用者。 如果使用者在 * 毫秒内收到至少一条消息,则该使用者被视为活动。maxConcurrentConsumersbatchSizereceiveTimeoutSpring中文文档

在默认设置下,减少使用者的算法工作方式如下:Spring中文文档

如果运行次数超过运行次数,并且使用者检测到连续十次超时(空闲),并且最后一个使用者至少在 60 秒前停止,则使用者将停止。 超时取决于 和 属性。 如果使用者在 * 毫秒内未收到任何消息,则将其视为空闲。 因此,使用默认超时(1 秒)和 4 秒,在空闲时间 40 秒后(4 次超时对应于一次空闲检测)后,将考虑停止使用者。concurrentConsumersreceiveTimeoutbatchSizebatchSizereceiveTimeoutbatchSizeSpring中文文档

实际上,只有当整个容器闲置一段时间时,才能停止使用者。 这是因为经纪人在所有活跃的消费者之间共享其工作。

每个使用者都使用单个通道,而不管配置的队列数量如何。Spring中文文档

从版本 2.0 开始,可以使用属性设置 和 属性,例如 .concurrentConsumersmaxConcurrentConsumersconcurrency2-4Spring中文文档

实际上,只有当整个容器闲置一段时间时,才能停止使用者。 这是因为经纪人在所有活跃的消费者之间共享其工作。

DirectMessageListenerContainer

使用此容器时,并发性基于配置的队列和 . 每个队列的每个使用者都使用单独的通道,并发性由 rabbit 客户端库控制。 默认情况下,在撰写本文时,它使用线程池。consumersPerQueueDEFAULT_NUM_THREADS = Runtime.getRuntime().availableProcessors() * 2Spring中文文档

您可以配置 a 以提供所需的最大并发性。taskExecutorSpring中文文档