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

时间:2011-03-18 19:41:53

标签: java jsp servlets scheduled-tasks background-process

我希望每隔6小时从订阅中检索并将订阅源存储到DB。我希望在后台有一个计时器线程来完成这项任务。

最好的方法是什么?普通的计时器线程或Quartz API?

1 个答案:

答案 0 :(得分:40)

首先,我不会使用JSP。那里不是。

当您使用Java EE 5时,请使用容器提供的jobscheduling API。更多细节取决于您正在使用的容器。例如,JBoss AS 5随附了Quartz。或者当你在JSP / Servlet之上使用一个提供jobs Spring作业调度API的框架时,你应该使用它。

如果没有(例如,您只使用Tomcat 6),或者您希望独立于容器和/或框架,请创建一个ServletContextListener ScheduledExecutorService。有关详细信息,请参阅this answer

或者当您已经在支持EJB 3.1的Java EE 6容器(JBoss AS 6,GlassFish 3,但因此而不是 Tomcat 7)上时,最简单的方法是创建{{3}使用@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小时运行一次任务的线程,请使用@Schedule中提供的示例,并在beforelinked answer方法中进行以下更改

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

班级UpdateSubscriptions必须实施scheduleAtFixedRate(),并且您需要使用Runnable run()方法完成实际工作,就像链接答案中的示例一样