Tomcat servlet应用程序的后台线程

Squ*_*Cog 60 java multithreading tomcat

我对Tomcat不是很熟悉,在我看来它基本上被抽象为cgi服务器,可以在调用之间保存JVM - 我知道它可以做更多的事情.

我正在寻找一种在Tomcat服务器启动时启动后台线程的方法,它会定期更新服务器上下文(在我的特定情况下,这是一个从其他服务中侦听心跳并更新可用性信息的线程,但可以想象各种用途).

有没有标准的方法来做到这一点?上下文的启动和更新/查询?

任何指向相关文档和/或代码示例的指针都将非常感激.

Chr*_*ill 79

如果要在部署WAR时启动线程,可以在web.xml中定义上下文侦听器:

<web-app>
    <listener>
       <listener-class>com.mypackage.MyServletContextListener</listener-class>
    </listener>
</web-app>
Run Code Online (Sandbox Code Playgroud)

然后实现那样的类:

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) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Thi*_*ilo 12

我正在寻找一种在Tomcat服务器启动时启动后台线程的方法

我想您正在寻找一种在Tomcat启动Web应用程序时启动后台线程的方法.

这可以使用ServletContextListener完成.它在web.xml中注册,并在您的应用程序启动或停止时调用.然后,您可以使用常规Java方法创建(并稍后停止)您的Thread,以创建一个Thread(或ExecutionService).


小智 5

<load-on-startup>1</load-on-startup><servlet>在web.xml块将迫使你的servlet的init()为Tomcat启动时,就会立即发生,而不是等待到达的第一条请求.如果要从中生成后台线程,这非常有用init().