Web应用程序中的计划任务?

Bar*_*lom 14 java tomcat servlets scheduled-tasks tomcat6

我正在为在线游戏构建统计应用程序,使用Java中的servlet API构建(将部署在Tomcat上).每次用户登录时,让游戏向stats服务器发送消息都很容易,因为处理请求是Servlets/Tomcat的用途.

我还需要定期在统计服务器上发起请求,例如从游戏服务器检索在线用户的数量或从我们的Facebook页面检索粉丝数量.

在应用程序的主servlet中启动一个线程并让它偶尔进行数据检索会很容易,但是感觉有点奇怪,因为所有其他线程都是由Tomcat创建的.

  1. 这样做好吗?
  2. 如果没有,推荐的方法是什么?
  3. 在这样的事情上使用servlet是否正确?有什么选择?

请注意第一个答案:我不是在寻找解决时序或并发问题的方法,因为我可以轻松处理这两个问题.我只需要知道如何在servlet容器中正确启动主动进程.

vas*_*kin 13

Quartz是您最好的选择,也是最具可配置性的.它具有基于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> 
Run Code Online (Sandbox Code Playgroud)


Bri*_*zel 9

你应该考虑:

不要费心重新发明轮子,Quartz和其他产品已经为您处理线程/超时/并发问题!

  • 2年后,更现代的TimerTask版本是[ScheduledExecutorService](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html) (5认同)