我有一个标准的GWT应用程序,它当然在后端使用Java servlet。此servlet部署在Tomcat和Windows Server上。
我知道这违反了规则/建议,但我在这个servlet中有一个线程,它在servlet初始化时启动(servlet的“init”方法)。该线程是各种调度程序,其目的是在某些时间执行不同的数据库任务,完全独立于GWT应用程序/接口本身。
我需要的是在部署战争后立即调用servlet的“init”方法。现在我一直在做的是,每次升级到应用程序时,我都会将战争放到正确的目录中,然后我必须“登录”到应用程序GWT应用程序,以便调用其“init”方法。我希望在战争更新后立即调用servlet的init方法,这样我就不必登录GWT应用程序来执行此操作。
有什么想法吗?
答案 0 :(得分:18)
您可以使用servlet context listener。更具体地说,您可以在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中的
答案 1 :(得分:4)
在WEB-INF / web.xml中使用load-on-startup。在Netbeans中,它位于Servlets选项卡中,即“启动顺序”项。
<servlet>
<servlet-name>Hl7Servlet</servlet-name>
<servlet-class>nl.vandenzen.Hl7Servlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
答案 2 :(得分:0)
另一种选择是使用Quartz Scheduler.
Quartz是一个功能齐全的开源软件 可以的工作调度系统 与侧面集成或一起使用 几乎任何J2EE或J2SE应用程序 - 从最小的独立应用程序到最大的电子商务 系统。 Quartz可用于创建 简单或复杂的时间表 执行数十,数百甚至甚至 成千上万的工作;工作的 任务被定义为标准Java 组件或EJB。石英 调度程序包括许多 企业级功能,例如JTA 交易和集群。
它非常易于使用,现有的全部原因是安排工作。这听起来像你想要做的。