JSP/Servlet Web 应用程序中的后台计时器任务

我想从订阅中检索,并在每 6 小时后从订阅中存储到 DB 的源。我想在后台有一个计时器线程来完成此任务。

最好的方法是什么?一个普通的计时器线程还是石英API?


答案 1

首先,我不会为此使用JSP。它不是为了那里。

当您使用 Java EE 5 时,请使用容器提供的 jobscheduling API 来实现此目的。更多详细信息取决于所使用的容器。例如,JBoss AS 5开箱即用,附带Quartz。或者,当你在JSP/Servlet之上使用一个框架,它提供了像Spring这样的工作API,那么你应该使用它。

如果没有(例如,您只使用Tomcat 6),或者您希望独立于容器和/或框架,请使用 ScheduledExecutorService 创建一个 ServletContextListener。在此答案中可以找到更多详细信息。

或者,当您已经在支持EJB 3.1(JBoss AS 6,GlassFish 3,但不是Tomcat 7)的Java EE 6容器上时,最简单的方法是使用@Schedule方法创建一个@Singleton EJB。

@Singleton
public class UpdateSubscriptions {

    @Schedule(hour="*/6", minute="0", second="0", persistent=false)
    public void run() {
        // Do your job here.
    }

}        

就是这样。无需进一步配置。


更新:根据评论,您正在使用Tomcat(6或7?要在 webapp 启动期间启动一个线程,该线程每 6 小时运行一次任务,请使用前面链接的答案中提供的示例,并在 scheduleAtFixedRate() 方法中进行以下更改

scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS);

该类必须实现 Runnable,并且实际作业需要在@Overriderun() 方法中完成,如链接答案中的示例所示。UpdateSubscriptions


答案 2