JSP / Servlet Web应用程序中的后台计时器任务
我想从订阅中检索订阅,并在每6小时后将订阅源从订阅存储到数据库。 我想在后台有一个计时器线程来完成这个任务。
什么是最好的方法? 一个普通的定时器线程或Quartz API?
首先,我不会为此使用JSP。 那里不是。
当您使用Java EE 5时,请使用容器提供的jobscheduling API。 进一步的细节取决于你正在使用的容器。 例如,JBoss AS 5带有Quartz。 或者,当您在提供jobscheduling API的JSP / Servlet之上使用框架(如Spring)时 ,则应该使用它。
如果没有(例如,您只使用Tomcat 6),或者您希望独立于容器和/或框架,请使用ScheduledExecutorService
创build一个ServletContextListener
。 进一步的细节可以在这个答案中find。
或者当您已经在支持EJB 3.1(JBoss AS 6,GlassFish 3,但不支持 Tomcat 7)的Java EE 6容器上时,最简单的方法是使用@Schedule
方法创build@Singleton
EJB。
@Singleton public class UpdateSubscriptions { @Schedule(hour="*/6", minute="0", second="0", persistent=false) public void run() { // Do your job here. } }
而已。 不需要进一步的configuration。
更新 :根据评论,你正在使用Tomcat(6或7?)。 要在每6小时运行一次任务的webapp启动过程中启动一个线程,请使用之前链接的答案中提供的示例,并在scheduleAtFixedRate()
方法中进行以下更改
scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS);
类UpdateSubscriptions
必须实现Runnable
,而实际的工作需要在@Override
的run()
方法中完成,就像链接答案中的例子。