我有一个普通的.java类。在该课程中,我使用Timer
课程计划方法来安排任务。在哪里实例化类
问题是我正在使用Java EE应用程序,我不知道该怎么样化这个类;从一个Servlet或类似的东西?我想只在应用程序启动时实例化该类。
我有一个普通的.java类。在该课程中,我使用Timer
课程计划方法来安排任务。在哪里实例化类
问题是我正在使用Java EE应用程序,我不知道该怎么样化这个类;从一个Servlet或类似的东西?我想只在应用程序启动时实例化该类。
您可能需要一个ServletContextListener
及其方法contextInitialized(..)
。它被调用一次,当你的应用程序被初始化。
您有任何@WebListener
或<listener><listener-class>..</...>
在web.xml
我完全没有意识到这一点,你可以通过一个例子来解释它。 – user1305398 2012-04-23 20:25:26
我添加了一个链接和一个段落。你只需要实现接口,在方法中做你需要做的事情,然后以建议的 – Bozho 2012-04-23 20:26:02
的方式映射类,但是我有一个问题。现在这个接口将由一个servlet实现,我明白了。但是,如果我再次调用servlet,当应用程序启动时,它会工作吗? – user1305398 2012-04-23 20:34:21
public class YourServlet extends HttpServlet {
private YourClass instance;
public void init() throws ServletException {
instance = new YourClass();
}
//code
}
映射听众通过在init()方法实例化你的类,您将确保您的类将在Java中唯一一次实例化,因为EE应用程序中,Servlet仅被加载到服务器内存一次。
,无论我调用这个servlet多少次,但是这个对象只会创建一次,除非和直到我将应用程序关闭为止。 – user1305398 2012-04-23 20:52:15
对,直到应用程序重新启动后,对象才会创建一次。 – Hidalgo 2012-04-23 21:14:22
+1,这是另一个选项,即每个servlet,而不是每个应用程序,就像在我的答案中一样。也是可行的,取决于用例 – Bozho 2012-04-23 21:31:02
石英-a流行scheduler-是一种常见的做法与时加载的启动属性设置为true一个Servlet的init方法来配置工作:
从this article,在web.xml中你应该这样做:
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<display-name>Quartz Initializer Servlet</display-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
然后在你的servlet conigure乔布斯:
public class QuartzServlet extends GenericServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
// And continue with your configuration
PS:我强烈建议更换你使用Quartz
顺便说一句,而不是'Timer',你可能想使用['ScheduledExecutorService'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService的.html)。 – 2014-02-23 11:20:50