У меня есть приложение командной строки, которая использует Spring-управляемый компонент, который, состоящие из Java ExecutorService
созданных с:Как правильно отключить службы-исполнители с помощью Spring?
ExecutorService service = Executors.newFixedThreadPool(4);
Теперь, я хочу, чтобы мой сервис для завершения работы, когда мое приложение завершает работу, так что я сделал свой боб реализовать интерфейс DisposableBean
и есть метод уничтожения, такие как:
public void destroy(){
service.shutdown();
}
Тогда я мог бы соблазниться, чтобы сделать что-то вроде зарегистрировать выключение крючок контекста Spring. Однако я обнаружил (жесткий способ, т. Е. В предварительном выпуске), что это не сработает: крюк остановки не вызывается до того, как вызывается метод ExecutorService.shutdown()
, вызывающий классическую проблему catch 22 (он получает вызванное прерыванием, т. е. если я нажму Ctrl-C во время работы приложения). Это ускользнуло от моих модульных тестов, потому что по какой-то причине кажется, что он работает отлично от JUnit, который все еще озадачивает меня: что делает JUnit по-другому?
Решение, которое я нашел до сих пор, заключается в явном вызове ApplicationContext.close()
прямо перед тем, как выйти из моей основной функции. Мне было интересно, есть ли лучшее решение для этого, и каковы наилучшие методы для гибких пулов потоков, управляемых Spring. Также, если мой bean не, управляемый непосредственно весной, а созданный bean-управлением, управляемым Spring? Должен ли я просто каскадировать вызовы на destroy()
? Разве это не было бы очень склонно к ошибкам?
Я ценю любые комментарии, предложения, дальнейшие исследования, RTFM, магические рецепты.
Спасибо!
PS: что делать, если я хочу перенести приложение с командной строкой на сервер приложений, такой как Tomcat? Что-нибудь изменилось? –
В том числе название и ваш PS Я считаю * семь * (7!) Вопросительных знаков. :-) Можете получить более эффективные ответы, если вы зададите только один конкретный вопрос. – Keith