如何用tomcat将类设置为守护进程?

时间:2011-07-27 01:15:50

标签: java tomcat tomcat5.5 daemons

我是java宇宙的新手,也是tomcat世界的新手。所以,问题是:

我需要运行一个java类作为守护进程。这个类应该能够与tomcat请求通信。

过去:当我在C中执行此操作时,我将二进制文件作为后台进程执行。

你能给我一些建议吗?

感谢ind advance!。

2 个答案:

答案 0 :(得分:3)

所以听起来答案有两个部分。第一个是确保你的守护进程使用tomcat容器启动,另一个是确保你的线程被正确配置,以便在关闭后不让tomcat实例保持活动状态。

由于关于线程的部分比较简单,我首先会解决这个问题。您生成的所有线程都应该是守护程序线程(例如,您调用了Thread.setDaemon(true))。引自O'reilly's Exploring Java's Chapter on Threads

  

在许多情况下,我们真正想要的是创建后台线程   在应用程序中执行简单的定期任务。 setDaemon()   方法可用于将Thread标记为应该是的守护程序线程   没有其他应用程序线程时,将被杀死并丢弃。   通常,Java解释器继续运行,直到所有线程都有   完成。但是当守护程序线程是唯一仍然活着的线程时,   口译员将退出。

拥有实时非守护程序线程将阻止tomcat的干净关闭。原因是tomcat保持一个非守护程序线程运行,直到它收到关闭消息,此时,所述线程停止。如果还有其他非守护程序线程,那么JVM将很乐意继续推进,并且您必须从命令行终止该进程。

现在我们继续挂钩servlet容器的生命周期,以便生成我们的服务。这里有两个步骤......我们必须像Jim Garrison建议的那样实现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 :(得分:1)

我认为你想要一个ServletContextListener,它将在servlet上下文启动和关闭时调用。您可以从那里开始和停止守护程序线程。