2010-03-08 2 views
6

Мое приложение использует весну DefaultMessageListenerContainer для обработки входящих сообщений. Основной метод приложения уже регистрирует крюк отключения.Лучший способ заставить Spring отключиться от боба?

Вопрос: что является лучшим способом заставить контекст приложения отключиться?

Если я выкидываю RuntimeException в прослушиватель сообщений, он обрабатывается контейнером и не передается. Вызывает ли System.exit приемлемое? Пропускаю ли я по адресу ApplicationContext для каждого класса, который должен быть отключен, поэтому я могу позвонить ему close()?

+1

почему вы должны закрыть вниз по контексту приложения? – Bozho

+0

Поскольку слушатель сообщения может решить, что ему нужно; либо потому, что оно получило сообщение администрирования, требующее закрытия приложения, либо из-за ненормального состояния. Их много, один из них - слишком много попыток приема (это система с большими объемами). – xcut

ответ

13

Вы можете указать свой контекст приложения на ConfigurableApplicationContext и позвонить по нему close(). По крайней мере, это то, что происходит, когда контекст закрывается в среде веб-приложения, в случаях, когда контекст сервлета уничтожен.

Если вы хотите получить Ахольд из ApplicationContext, ваш боб может реализовать ApplicationContextAware

Другой вариант заключается в инъекции (или autowire с @Autowired) контекст приложения:

@Inject 
private ApplicationContext ctx; 
+0

Каким образом компонент, который должен выполнить shutdown, получает контекст? Это POJO в конце концов .. – xcut

+0

@xcut зависит от вашего приложения. Это веб-приложение, настольное приложение? – Bozho

+0

Ни то, ни другое - система очередности сообщений/маршрутизации. Поэтому я предполагаю, что единственный способ - передать контекст компоненту или реализовать какой-то дополнительный интерфейс жизненного цикла? – xcut