2012-04-23 164 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