我想每 6 小时后从订阅中检索和存储订阅源到数据库。我想在后台有一个计时器线程来完成这项任务。
最好的方法是什么?一个普通的定时器线程还是 Quartz API?
最佳答案
首先,我不会为此使用 JSP。它不适合。
当您使用 Java EE 5 时,请为此使用容器提供的作业调度 API。更多细节取决于您使用的容器。例如,JBoss AS 5 附带了 Quartz。或者,当您在 JSP/Servlet 之上使用提供作业调度 API 的框架时,例如 Spring ,那么你应该使用它。
如果没有(例如,您只使用 Tomcat 6),或者您想独立于容器和/或框架,请创建 ServletContextListener
与 ScheduledExecutorService
.更多细节可以在 this answer 中找到.
或者当您已经在支持 EJB 3.1(JBoss AS 6、GlassFish 3,但 不是 Tomcat 7)的 Java EE 6 容器上时,最简单的方法是创建一个 @Singleton
带有 @Schedule
的 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 小时运行一次任务,请使用 beforelinked answer 中提供的示例。并在 scheduleAtFixedRate()
中进行以下更改方法
scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS);
UpdateSubscriptions
类必须实现 Runnable
实际工作需要在 run()
中完成你的方法@Override
,就像链接答案中的示例一样。
关于java - JSP/Servlet Web 应用程序中的后台定时器任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5357033/