Так что, похоже, ответ состоит из двух частей.Во-первых, убедитесь, что ваш демон запускается с контейнером tomcat, а во-вторых, убедитесь, что ваш поток правильно настроен, чтобы не поддерживать экземпляр tomcat после завершения работы.
часть о потоке проще, я сначала уберу это с пути.Все потоки, которые вы создаете, должны быть потоками демонов (например, вы назвали Thread.setDaemon (true) ).Цитата из Ореилли, глава «Изучаем Java» по потокам :
Во многих случаях мы действительно хотим создать фоновые потоки, которые выполняют простые периодические задачи в приложении.Метод setDaemon () можно использовать, чтобы пометить поток как поток демона, который следует уничтожать и отбрасывать, если не осталось других потоков приложения.Обычно интерпретатор Java продолжает работать, пока не завершатся все потоки.Но когда потоки демона являются единственными оставшимися в живых потоками, интерпретатор завершает работу.
Наличие живых потоков, не являющихся демонами, предотвратит полное отключение tomcat.Причина этого в том, что tomcat поддерживает работу одного потока, не являющегося демоном, до тех пор, пока не получит сообщение о завершении работы, после чего указанный поток будет остановлен.Если есть другие потоки, не являющиеся демонами, JVM с радостью продолжит работать, и вам придется убить процесс из командной строки.
А теперь мы переходим к подключению к жизненному циклуКонтейнер сервлетов для порождения нашего сервиса.Здесь есть два шага ... мы должны реализовать ServletContextListener
, как предложил Джим Гаррисон, и затем мы должны указать контейнеру загрузить его.Здесь есть две вещи:
Шаг 1: Реализация ServletContextListener
:
public class MyDaemonServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
Thread th = new Thread() {
public void run() {
// implement daemon logic here.
}
};
th.setDaemon(true);
th.start();
}
public void contextDestroyed(ServletContextEvent sce) {
// you could notify your thread you're shutting down if
// you need it to clean up after itself
}
}
Шаг 2: Объявите это в своем web.xml
:
<listener>
<listener-class>MyDaemonServletContextListener</listener-class>
</listener>
И это должно быть так.