2010-11-08 49 views
14

我正在構建一個使用Java中的servlet API(將部署在Tomcat上)構建的在線遊戲的統計應用程序。每當用戶登錄時,讓遊戲向統計信息服務器發送消息很容易,因爲處理請求是Servlets/Tomcat的用途。Web應用程序中的計劃任務?

我還需要定期在統計服務器上啓動請求,例如從遊戲服務器檢索在線用戶的數量或從我們的Facebook頁面中檢索粉絲的數量。

在應用程序的主要servlet中啓動一個線程並讓它在一段時間內完成數據檢索會很容易,但感覺有點奇怪,因爲所有其他線程都是由Tomcat創建的。

  1. 這樣做好嗎?
  2. 如果不是,那麼建議如何操作?
  3. 對於像這樣的東西使用servlet是否正確?有什麼選擇?

第一次答案後注意:我沒有尋找時間或併發問題的解決方案,因爲我可以輕鬆地處理這兩個問題。我只需要知道如何在servlet容器中正確啓動一個主動進程。

回答

13

石英是你最好的選擇,也是最高度可配置的。它具有基於CRON的界面或更具動態的方式來生成與特定事件相關的作業,如果您的用例需要Quartz可以完成的話。它可以將作業保留到數據庫,以便重新啓動。

http://www.quartz-scheduler.org/

請在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> 

    <init-param> 
     <param-name>shutdown-on-unload</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    <init-param> 
     <param-name>start-scheduler-on-load</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    </servlet> 
+0

謝謝,但具體的時間問題不是我需要處理的。從Quartz + Tomcat的教程來看,你仍然需要啓動和停止Quartz,其方式與我如何開始自己的線程相同。 – 2010-11-09 10:32:51

+0

我不確定您正在查看哪個教程,但通常您希望通過配置自動啓動它,而不是依賴運行時依賴項,因此它更清晰。也許這就是你要找的。 – vaskin 2010-11-09 14:44:06

9

你應該考慮:

不要打擾重新發明輪子,石英石等產品已處理線程/超時/併發問題爲您服務!

+5

2年後,更現代的TimerTask版本是[ScheduledExecutorService](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html) – Danger 2012-11-17 17:27:46

+0

豎起大拇指提到更多比做一個方法 – jsh 2013-08-30 14:05:58

相關問題