2010-11-08 71 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