2

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

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

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

你能给我一些建议如何进行吗?

提前感谢!

4

2 回答 2

4

所以听起来答案有两个部分。第一个是确保您的守护程序使用 tomcat 容器启动,另一个是确保您的线程得到正确配置,以免在关闭后保持 tomcat 实例处于活动状态。

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

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

拥有实时的非守护线程将阻止 tomcat 的干净关闭。这样做的原因是tomcat保持一个非守护线程运行,直到它收到关闭消息,此时,所述线程停止。如果还有其他非守护线程,那么 JVM 将愉快地继续运行,您将不得不从命令行中终止该进程。

现在我们开始挂钩到 servlet 容器的生命周期,以便生成我们的服务。这里有两个步骤......我们必须ServletContextListener按照 Jim Garrison 的建议实现 a,然后我们必须告诉容器加载它。这里有两件事:

第 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>

应该就是这样。

于 2011-07-27T01:27:59.343 回答
1

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

于 2011-07-27T02:25:45.610 回答