2013-10-26 2 views
0

я видел некоторые используют код ShutdownHook как этотКак мы можем использовать addShutdownHook в проекте?

Runtime.getRuntime().addShutdownHook(new Thread(){ 
    ConfigurableApplicationContext.stop(); 
    //close spring context; 
    threadpool.shutdownnow(); 
    //close theadpool 
}); 

есть все, что полезно делать, как это?

я думал

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

что мы будем делать дальше, когда необходимо вызвать System.exit()?

ответ

0

Это действительно зависит от вашего приложения и жизненного цикла ваших объектов и тех потоков, которые, по-видимому, выходят за пределы вашего контекста. Если вы используете весенний контейнер внутри автономного java-процесса, то захват крюка остановки, как это, является одним из способов сделать это. Другой способ - прослушать его на порту tcp и отправить команду для запуска процесса останова. Если вы работаете в веб-контейнере, таком как tomcat, тогда вы должны следовать стандартам при нормальном отключении webapp, который Spring поддерживает с помощью Context Listeners.

Я также хотел бы перепроектировать ваше приложение, чтобы все потоки управлялись с помощью компонента, который живет внутри вашего весеннего контейнера. Например, используя компонент, который настроен с директивами (атрибутами) для методов start/stop, а затем этот компонент будет использовать Executor для объединения потоков. Таким образом, ваше выключение - это ТОЛЬКО закрытие контейнера Spring, а Spring обеспечивает очень хорошую поддержку для упорядоченного закрытия компонентов. Один из этих бобы - это ваш объект, содержащий потоки внутри Исполнителя. Это гораздо более чистый способ, чем пытаться интегрировать весенние бобы с внешними потоками.

Надеюсь, это поможет.

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