我是java宇宙的新手,也是tomcat世界的新手。所以,问题是:
我需要运行一个java类作为守护进程。这个类应该能够与tomcat请求通信。
过去:当我在C中执行此操作时,我将二进制文件作为后台进程执行。
你能给我一些建议吗?
感谢ind advance!。
答案 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上下文启动和关闭时调用。您可以从那里开始和停止守护程序线程。