我是 java 世界的新手,也是 tomcat 世界的新手。所以,问题是:
我需要将 java 类作为守护进程运行。这个类应该能够与 tomcat 请求通信。
过去:当我在 C 中执行此操作时,我将二进制文件作为后台进程执行。
你能给我一些建议如何进行吗?
提前感谢!
所以听起来答案有两个部分。第一个是确保您的守护程序使用 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>
应该就是这样。
我想你想要一个ServletContextListener
,它将在 servlet 上下文启动和关闭时被调用。您可以从那里启动和停止守护线程。