Таким образом, похоже, что ответ состоит из двух частей. Во-первых, убедитесь, что ваш демон запускается с контейнером tomcat, а во-вторых, убедитесь, что ваш поток правильно сконфигурирован, чтобы не поддерживать экземпляр tomcat после завершения работы.
Поскольку часть о многопоточности проще, я сначала уберу ее. Все создаваемые вами потоки должны быть потоками демона (например, вы вызвали Thread.setDaemon(true)). Цитата из главы O'reilly "Изучение 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>
И это должно быть так.
person
stevevls
schedule
27.07.2011