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

Mal*_*Tec 21 java jsp servlets scheduled-tasks background-process

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

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

Bal*_*usC 40

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

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

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

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

@Singleton
public class UpdateSubscriptions {

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

}        
Run Code Online (Sandbox Code Playgroud)

而已.无需进一步配置.


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

scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS);
Run Code Online (Sandbox Code Playgroud)

该类UpdateSubscriptions必须实现Runnable,并且实际的工作需要在run()您使用的方法中完成@Override,就像链接的答案中的示例一样.

  • +1不能得到任何完美的答案. (2认同)