Как установить класс как демон с Tomcat? - PullRequest
1 голос
/ 27 июля 2011

Я новичок во вселенной Java, также новичок в мире котов. Итак, вопрос:

Мне нужно запустить Java-класс в качестве демона. Этот класс должен быть в состоянии общаться с запросами tomcat.

В прошлом: когда я делал это в C, я выполнял двоичный файл как фоновый процесс.

Не могли бы вы дать мне несколько советов, как поступить?

спасибо заранее!.

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Так что, похоже, ответ состоит из двух частей.Во-первых, убедитесь, что ваш демон запускается с контейнером 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>

И это должно быть так.

1 голос
/ 27 июля 2011

Я думаю, вы хотите ServletContextListener, который будет вызываться при запуске и завершении работы контекста сервлета. Оттуда вы можете запускать и останавливать поток демона.

...