我希望每隔6小时从订阅中检索并将订阅源存储到DB。我希望在后台有一个计时器线程来完成这项任务。
最好的方法是什么?普通的计时器线程或Quartz API?
答案 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()
方法完成实际工作,就像链接答案中的示例一样