2016-05-09 5 views
2

Каково поведение при использовании следующей конструкции (последняя версия Spring). Я не могу найти его в документации.Поведение нескольких очередей RabbitListener

@RabbitListener(queues = {"q1", "q2", "q3"}) 
public class MyListener { 

В каком порядке обрабатываются сообщения из 3-х очередей?

ответ

2

Неопределенный - 3 basicConsume операции выполняются на потребительском канале (если вы увеличиваете количество одновременных потребителей на 3 потребителя). Операции basicConsume обычно выполняются в порядке определения очередей (во всех случаях, если одна или несколько очередей временно «отсутствуют»).

Брокер отправляет сообщения из каждой очереди до prefetchCount (basicQos) для каждой очереди (по умолчанию 1).

Я не знаю фактического алгоритма, используемого брокером в этом сценарии, но вы должны считать его неопределенным - Spring AMQP доставляет их слушателю (слушателям) в порядке, полученном от брокера.

EDIT

Я просто побежал тест (2 очереди каждый с 2 ​​существующих сообщений), и они были доставлены по круговой - q1m1, q2m1, q1m2, q2m2 когда упреждающей был 1.

Когда prefetch установлен в 4, я вижу q1m1, q1m2, q2m1, q2m2.

Конечно, когда очереди пустые, сообщения обычно поступают в том порядке, в котором они поступают к брокеру.

EDIT2

См Consumer Prefetch.

Spring AMQP использует вариант basicQos без глобального arg, поэтому используется значение по умолчанию (false). Это означает, что предварительная выборка предназначена для каждого потребителя.