2012-04-23 165 views
3

我有一个普通的.java类。在该课程中,我使用Timer课程计划方法来安排任务。在哪里实例化类

问题是我正在使用Java EE应用程序,我不知道该怎么样化这个类;从一个Servlet或类似的东西?我想只在应用程序启动时实例化该类。

+0

顺便说一句,而不是'Timer',你可能想使用['ScheduledExecutorService'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService的.html)。 – 2014-02-23 11:20:50

回答

4

您可能需要一个ServletContextListener及其方法contextInitialized(..)。它被调用一次,当你的应用程序被初始化。

您有任何@WebListener<listener><listener-class>..</...>在web.xml

+0

我完全没有意识到这一点,你可以通过一个例子来解释它。 – user1305398 2012-04-23 20:25:26

+0

我添加了一个链接和一个段落。你只需要实现接口,在方法中做你需要做的事情,然后以建议的 – Bozho 2012-04-23 20:26:02

+0

的方式映射类,但是我有一个问题。现在这个接口将由一个servlet实现,我明白了。但是,如果我再次调用servlet,当应用程序启动时,它会工作吗? – user1305398 2012-04-23 20:34:21

1
public class YourServlet extends HttpServlet { 
private YourClass instance; 

public void init() throws ServletException { 
     instance = new YourClass(); 
} 
//code 
} 

映射听众通过在init()方法实例化你的类,您将确保您的类将在Java中唯一一次实例化,因为EE应用程序中,Servlet仅被加载到服务器内存一次。

+0

,无论我调用这个servlet多少次,但是这个对象只会创建一次,除非和直到我将应用程序关闭为止。 – user1305398 2012-04-23 20:52:15

+0

对,直到应用程序重新启动后,对象才会创建一次。 – Hidalgo 2012-04-23 21:14:22

+0

+1,这是另一个选项,即每个servlet,而不是每个应用程序,就像在我的答案中一样。也是可行的,取决于用例 – Bozho 2012-04-23 21:31:02

0

石英-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