2011-04-09 138 views
2

如果我錯誤地描述了這個,你將不得不原諒我,但實際上我試圖讓服務類的類只在服務器啓動時實例化一次,在後臺直到它在服務器停止時被殺死。至少從我所知道的情況來看,這與典型的servlet不完全相同(儘管我可能對此有錯)。更重要的是,我還需要能夠在線後訪問此服務/對象。java ee後臺服務

作爲一個例子,在我所研究的另一個項目中,我們使用Spring框架來完成類似的事情。本質上,我們使用配置XML文件和內置的註釋讓Spring知道實例化一些我們的服務的實例。稍後,我們使用註釋@Autowired來「抓取」這個預先實例化的服務/對象的對象引用。所以,儘管它看起來可能與Java本身的一些主要概念有所不同,但我只是想弄清楚如何在這裏重新發明這個輪子。我想有時候我覺得這些大型應用程序框架在幕後做了太多的「黑盒魔術」,我真的很想調整它。

感謝您的任何幫助和/或建議!


哦,我想所有的JBoss從6

+0

Spring的IOC和自動裝配是不是你想要的?它可以讓你創建任何其他類可以到達的單身人士。 – 2011-04-10 01:11:03

+0

我的猜測是他目前的項目中沒有Spring。恕我直言,只爲單身人士添加Spring將是一個矯枉過正的行爲。 – 2011-04-10 02:12:47

回答

4

以下是一種方法。一個servlet上下文偵聽器添加到您的web.xml,例如:

<listener> 
    <listener-class>com.example.BackgroundServletContextListener</listener-class> 
</listener> 

然後創建一個類來管理您的後臺服務。在這個例子中,我使用單線程ScheduledExecutorService安排它每5分鐘運行:

public class BackgroundServletContextListener implements ServletContextListener { 
    private ScheduledExecutorService executor; 
    private BackgroundService service; 

    public void contextInitialized(ServletContextEvent sce) { 
     service = new BackgroundService(); 

     // setup single thread to run background service every 5 minutes 
     executor = Executors.newSingleThreadScheduledExecutor(); 
     executor.scheduleAtFixedRate(service, 0, 5, TimeUnit.MINUTES); 

     // make the background service available to the servlet context 
     sce.getServletContext().setAttribute("service", service); 
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
     executor.shutdown(); 
    } 
} 

public class BackgroundService implements Runnable { 
    public void run() { 
     // do your background processing here 
    } 
} 

如果您需要從Web請求訪問BackgroundService,您可以通過ServletContext訪問它。例如。:

ServletContext context = request.getSession().getServletContext(); 
BackgroundService service = (BackgroundService) context.getAttribute("service"); 
+0

這很直觀..我已經越過了實現上下文監聽器的概念,我只是不知道如何使該服務可用於Web應用程序的其他部分。 context.setAttribute()似乎是應該做的。謝謝! – jerluc 2011-04-10 07:16:58

+0

這非常有幫助。我想知道它是否可以在JBoss AS 5.1.0上使用?我無法找到此版本中內置的ServletContextListener ...如果我從JBoss 7.1下載到lib或構建路徑中添加「jboss-servlet-api_3.0_spec-1.0.0.Final.jar」,我可以使用javax。 servlet,但我相信這會導致一些兼容性問題。 5.1有沒有好的選擇? – 2013-08-05 20:14:20

2

運行這個你有沒有考慮使用EJB 3.1會話bean?這些可以部署在war文件中,並可以使用@Singleton和@Startup進行註釋。

許多EJB 3.1的註解旨在將Spring的好東西帶入Java EE框架。這可能是你正在考慮的重新發明已經爲你完成了。

0

如果你必須推出自己的,你可以創建一個servlet和配置,當應用程序使用load-on-startup它啓動。幾年前,我建立了一個這樣的系統。然後,我們使用新的(ish)java.util.concurrent類似於ExecutorService的東西來讓它處理來自其他servlet的工作。

有關您想要做什麼以及現有做事方式不足的更多信息將有所幫助。