Tomcat自动启动Servlet

10

我有一个标准的GWT应用程序,它当然使用后端的Java servlet。这个servlet部署在Tomcat和Windows服务器上。

我知道这违反了规则/建议,但是我在这个servlet中有一个线程,在servlet初始化时启动(即servlet的“init”方法)。该线程类似于调度程序,其目的是在特定时间执行不同的数据库任务,完全独立于GWT应用程序/界面本身。

我需要的是,一旦WAR文件部署,就会立即调用servlet的“init”方法。现在我一直在做的是,每次应用程序升级时,将war文件放入正确的目录中,然后必须“登录”到GWT应用程序,以便调用其“init”方法。我希望能在更新WAR文件后立即调用servlet的init方法,这样我就不必登录到GWT应用程序来执行此操作。

有什么想法吗?

3个回答

17

你可以使用servlet上下文监听器。更具体地,在contextInitialized方法中启动线程:

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
         // start the thread
    }

    public void contextDestroyed(ServletContextEvent sce) {
         // stop the thread
    }
}
请提供更多上下文信息,以便我正确地翻译内容。
<listener>
    <description>ServletContextListener</description>
    <listener-class>MyListener</listener-class>
</listener>

在你的web.xml文件中


4

使用WEB-INF / web.xml中的load-on-startup。 在Netbeans中,它在Servlets选项卡中,项目为“Startup order”。

<servlet>
    <servlet-name>Hl7Servlet</servlet-name>
    <servlet-class>nl.vandenzen.Hl7Servlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

是的,使用load-on-startup可以轻松解决这个问题,并且它适用于Web Servlet 2.4或更高版本。 - zg_spring

0

另一个选择是使用Quartz Scheduler

Quartz是一个功能齐全的开源作业调度系统,可以与几乎任何J2EE或J2SE应用程序集成或并行使用,从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的计划,以执行数十个、数百个甚至数万个任务;这些任务的任务被定义为标准Java组件或EJB。Quartz调度程序包括许多企业级功能,例如JTA事务和集群。

它非常易于使用,其存在的全部原因就是为了安排工作。这听起来就像您想要做的事情。


这可能是个有效的解决方案,但现在我只需要尽可能简单的东西,这样我的代码就需要尽可能少的更改。不过还是谢谢,将来我会仔细研究这个问题... - user85116

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接