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

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

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

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

  1. 这样做可以吗?
  2. 如果没有,推荐的执行此操作的方法是什么?
  3. 使用 servlets 做这样的事情是否正确?还有什么替代方案?

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


答案 1

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> 

答案 2

您应该考虑:

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


推荐