RabbitListener 多队列行为

cof*_*ine 3 java spring rabbitmq spring-rabbit spring-amqp

使用以下构造(Spring 的最新版本)时的行为是什么?我无法在文档中找到它。

@RabbitListener(queues = {"q1", "q2", "q3"})
public class MyListener {
Run Code Online (Sandbox Code Playgroud)

3 个队列中的消息按什么顺序处理?

Gar*_*ell 5

它是不确定的 -basicConsume在消费者通道上执行 3 个操作(如果增加并发消费者,则每个消费者执行 3 个操作)。这些basicConsume操作通常按照队列定义的顺序执行(在所有情况下,除非一个或多个队列暂时“丢失”)。

代理会将消息从每个队列发送到每个队列的prefetchCount( )(默认为 1)。basicQos

我不知道代理在这种情况下使用的实际算法,但您应该假设它是不确定的 - Spring AMQP 会按照从代理收到的顺序将它们传递给侦听器。

编辑

我刚刚运行了一个测试(2 个队列,每个队列有 2 条现有消息),当预取为 1 时,它们会循环传递 - q1m1、q2m1、q1m2、q2m2。

当预取设置为 4 时,我看到 q1m1、q1m2、q2m1、q2m2。

当然,当队列为空时,消息通常会按照到达代理的顺序到达。

编辑2

请参阅消费者预取

Spring AMQP 使用没有全局参数的变体,因此使用basicQos默认值 ( )。false这意味着预取是针对每个消费者的。