Как изящно закрыть Spring JMS MessageListenerAdapter
Вопрос
У меня есть обработчик сообщений, который получает из очереди JMS и отправляет результаты в другую очередь JMS. Обработчик сообщений находится в Spring DefaultMessageListenerContainer. Когда контейнер закрывается, я хотел бы, чтобы он завершил обработку любых запросов, которые он уже использовал, и отправил результаты. В то же время он больше не должен получать новые сообщения из очереди запросов.
Прямо сейчас, без специальных положений о закрытии, безопасных ApplicationContext.registerShutdownHook (), контейнер ожидает возврата любых ожидающих вызовов listernerMethod, но не отправляет результаты в очередь ответов.
Какой подход был бы для того, чтобы убедиться, что ответы, создаваемые запущенными обработчиками, отправляются в очередь ответов?
Решение
Я думаю, что путь должен идти через интерфейс DisposableBean
или аннотацию @PreDestroy
. Ключевым моментом IMHO является не позволить Spring завершить работу DMLC, а позволить этому сделать компонент, который знает о сообщениях, которые в данный момент находятся «внутри системы». Таким образом, вы перестаете прослушивать новые сообщения, ожидая завершения обработанных в данный момент сообщений.
Используя атрибут depen-on
в объявлениях bean-компонентов, вы также можете определить порядок завершения bean-компонентов. Узнайте больше об этом в справочнике Spring. документация .