Как изящно закрыть канал и соединение, когда длина очереди достигает нуля?

Мы используем библиотеку Spring AMQP для приема сообщений из очередей в RabbitMQ. Наш издатель создает переменное количество сообщений по известному расписанию, поэтому мы думаем о том, чтобы запускать потребителей по расписанию и останавливаться, когда очередь пуста.

Мне интересно, как изящно закрыть канал и соединение, когда длина очереди достигает нуля?


person Giri Chintala    schedule 11.05.2016    source источник


Ответы (1)


Предстоящий выпуск 1.6 (кандидат на выпуск был выпущен на прошлой неделе, общедоступная версия должна состояться в конце следующей недели) имеет новая функция для генерации событий, когда контейнер прослушивателя простаивает.

Вы можете остановить контейнер при получении такого события. Вы не должны не останавливать контейнер в потоке, в котором вызывается прослушиватель событий — вместо этого передать событие в новый поток. Если вы попытаетесь остановить контейнер в том же потоке, это вызовет задержку, потому что контейнер ожидает освобождения потока.

person Gary Russell    schedule 11.05.2016
comment
Спасибо Гэри! идеальное решение! Просто любопытно, как SpringAMQP обнаруживает незанятый контейнер? - person Giri Chintala; 11.05.2016
comment
Поток-слушатель просыпается каждые receiveTimeout (по умолчанию 1 секунда) и проверяет время с момента получения последнего сообщения. Если idleEventInterval превышено, событие публикуется. - person Gary Russell; 11.05.2016
comment
отличный! Еще раз спасибо за разъяснение! - person Giri Chintala; 11.05.2016