2015-11-21 2 views
0

Мы используем Spring AMQP для подключения к RabbitMQ в нашем веб-приложении Spring.Spring AMQP ListenerContainer управление жизненным циклом

Когда мы объявляем наши контейнеры-слушатели как бобы (используя rabbit:listener-container) в контексте приложения, их жизненный цикл управляется Spring.

Если мы объявляем слушатель-контейнер в компоненте внутри метода @PostConstruct, или мы создаем боб с классом org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer в качестве прототипа области действия фасоли, мы тогда должны управлять жизненным циклом, т.е. запуска и остановки слушателя-контейнер сам.

Мой вопрос, если мы объявляем новые очереди, привязок и слушателем-контейнеры внутри метода @PostConstruct, просто вызывая listener.stop/shutdown/destroy метод внутри соответствующего @PreDestroy метода будет достаточно для постепенного выключения? Или что мне нужно делать?

Примечание: Я предполагаю, что мне не нужно ничего делать для новых очередей и привязок, созданных в @PostContruct, но я был бы очень рад, если вы также подтвердите это для меня.

ответ

1

Я бы не рекомендовал запускать контейнер-слушатель или объявлять очереди/привязки в методе @PostConstruct; в то время контекст только полупелен. Он может работать, но не рекомендуется делать такие вещи, пока контекст инициализируется.

Лучше реализовать SmartLifecycle и начать/остановить их в методах start()/stop().

Тогда жизненные циклы контейнера будут косвенно управляться весенним контекстом.

Вы также можете точно контролировать, когда ваш бит запущен/остановлен, поставив его в фазе.

+0

Спасибо за ответ. Я буду использовать интерфейс SmartLifecycle вместо использования '@ Postconstruct/@ PreDestroy'. Кроме того, просто вызов 'stop' в контейнере-слушателе очистит все изящно, не так ли? И нечего делать для очередей и привязок? – nilgun

+0

Это зависит от того, что вы подразумеваете под очисткой. Если вы объявите очередь/обмен как автоматическое удаление, они автоматически исчезнут, когда контейнер остановится; очередь сначала удаляется; обмен удаляется, если нет очередей. Если вы хотите, чтобы они оставались между вызовами (чтобы избежать потери сообщений), нет никакой очистки; объявление их в следующий раз будет идемпотентным, и вы получите все сообщения, оставшиеся от последнего вызова. Если вы не объявляете их автоматическим удалением, и вы хотите, чтобы они ушли, вам нужно будет удалить их (например, с помощью RabbitAmin) после остановки контейнера. –

+1

Обратите внимание, что при удалении соединений автоматическое удаление может быть проблематичным. Запущенные весной очереди и т. Д. Автоматически повторно объявляются при восстановлении соединения. Поскольку по какой-то причине вы катаетесь самостоятельно, вам придется обрабатывать объекты автоматического удаления объектов после сбоя соединения. Как правило, проще просто позволить Spring заботиться о вещах для вас, а не делать это самостоятельно. –

Смежные вопросы