我对Tomcat不太熟悉,我认为它基本上是一个cgi服务器,可以在调用之间保存JVM(Java虚拟机) - 我知道它可以做更多的事情。
我正在寻找一种方法,在Tomcat服务器启动时启动后台线程,该线程会定期更新服务器上下文(在我的特定案例中,这是一个侦听来自其他服务的心跳并更新可用性信息的线程,但人们可以想象出各种用途)。
是否有标准方法来实现这一点?包括启动和更新/查询上下文。
如果能提供相关文档和/或代码示例,将不胜感激。
我对Tomcat不太熟悉,我认为它基本上是一个cgi服务器,可以在调用之间保存JVM(Java虚拟机) - 我知道它可以做更多的事情。
我正在寻找一种方法,在Tomcat服务器启动时启动后台线程,该线程会定期更新服务器上下文(在我的特定案例中,这是一个侦听来自其他服务的心跳并更新可用性信息的线程,但人们可以想象出各种用途)。
是否有标准方法来实现这一点?包括启动和更新/查询上下文。
如果能提供相关文档和/或代码示例,将不胜感激。
如果你想在部署WAR文件时启动一个线程,你可以在web.xml中定义一个上下文监听器:
<web-app>
<listener>
<listener-class>com.mypackage.MyServletContextListener</listener-class>
</listener>
</web-app>
然后实现那个类的代码如下:
public class MyServletContextListener implements ServletContextListener {
private MyThreadClass myThread = null;
public void contextInitialized(ServletContextEvent sce) {
if ((myThread == null) || (!myThread.isAlive())) {
myThread = new MyThreadClass();
myThread.start();
}
}
public void contextDestroyed(ServletContextEvent sce){
try {
myThread.doShutdown();
myThread.interrupt();
} catch (Exception ex) {
}
}
}
我正在寻找一种方法,在Tomcat服务器启动时启动一个后台线程
我认为您正在寻找一种方法,在Tomcat启动您的Web应用程序时启动后台线程。
这可以通过使用ServletContextListener来实现。该监听器在web.xml中注册,并在您的应用程序启动或停止时调用。然后,您可以使用普通的Java方式创建线程(或ExecutionService)来创建(和稍后停止)您的线程。
<load-on-startup>1</load-on-startup>
放置在块中,可以使您的servlet的init()
在Tomcat启动时立即发生,而不必等待第一个请求到达。 如果您想从init()
生成后台线程,则此功能非常有用。我想对Chris提供的非常详细的答案做出一点小修改; 我会通过myThread.setDaemon(true);
将myThread
设置为守护线程,这将使得当您有其他非守护线程需要您的后台线程时,该线程保持活动状态。当所有这些线程完成时,JVM将停止您的守护线程,并且您不需要在contextDestroyed
中自己处理它。
但这只是我的个人意见。
如果您使用基于Spring框架的方式,您可以在beans.xml中指定要初始化的类/线程。因此,当Tomcat启动时,beans.xml将初始化其中提到的所有类。如果需要,您还可以传递构造函数参数。以下是示例。
beans.xml
<bean id="monitoringSvc" class="com.mypackage.MonitoringService">
<constructor-arg value="60"></constructor-arg>
</bean>
MonitoringService.java
public class MonitoringService{
private MyThread myThread;
public MonitoringService(int seconds){
myThread = new MyThread(seconds);
myThread.start();
}
}