как установить класс как демон с tomcat?

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

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

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

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

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


person subzero    schedule 27.07.2011    source источник


Ответы (2)


Таким образом, похоже, что ответ состоит из двух частей. Во-первых, убедитесь, что ваш демон запускается с контейнером 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
comment
спасибо stevevls, я понимаю, что вы говорите. но как мне сказать коту: эй, класс X - это демон, как только вы запустите его, запустите его? - person subzero; 27.07.2011
comment
@subzero Хорошо ... я переписал свой ответ. Надеюсь, это поможет. - person stevevls; 28.07.2011

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

person Jim Garrison    schedule 27.07.2011