Вопрос

У меня есть обработчик сообщений, который получает из очереди JMS и отправляет результаты в другую очередь JMS. Обработчик сообщений находится в Spring DefaultMessageListenerContainer. Когда контейнер закрывается, я хотел бы, чтобы он завершил обработку любых запросов, которые он уже использовал, и отправил результаты. В то же время он больше не должен получать новые сообщения из очереди запросов.

Прямо сейчас, без специальных положений о закрытии, безопасных ApplicationContext.registerShutdownHook (), контейнер ожидает возврата любых ожидающих вызовов listernerMethod, но не отправляет результаты в очередь ответов.

Какой подход был бы для того, чтобы убедиться, что ответы, создаваемые запущенными обработчиками, отправляются в очередь ответов?

Это было полезно?

Решение

Я думаю, что путь должен идти через интерфейс DisposableBean или аннотацию @PreDestroy . Ключевым моментом IMHO является не позволить Spring завершить работу DMLC, а позволить этому сделать компонент, который знает о сообщениях, которые в данный момент находятся «внутри системы». Таким образом, вы перестаете прослушивать новые сообщения, ожидая завершения обработанных в данный момент сообщений.

Используя атрибут depen-on в объявлениях bean-компонентов, вы также можете определить порядок завершения bean-компонентов. Узнайте больше об этом в справочнике Spring. документация .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top