JSP/Servlet Web 应用程序中的后台计时器任务
2022-09-02 00:56:52
我想从订阅中检索,并在每 6 小时后从订阅中存储到 DB 的源。我想在后台有一个计时器线程来完成此任务。
最好的方法是什么?一个普通的计时器线程还是石英API?
我想从订阅中检索,并在每 6 小时后从订阅中存储到 DB 的源。我想在后台有一个计时器线程来完成此任务。
最好的方法是什么?一个普通的计时器线程还是石英API?
首先,我不会为此使用JSP。它不是为了那里。
当您使用 Java EE 5 时,请使用容器提供的 jobscheduling API 来实现此目的。更多详细信息取决于所使用的容器。例如,JBoss AS 5开箱即用,附带Quartz。或者,当你在JSP/Servlet之上使用一个框架,它提供了像Spring这样的工作API,那么你应该使用它。
如果没有(例如,您只使用Tomcat 6),或者您希望独立于容器和/或框架,请使用 ScheduledExecutorService
创建一个 ServletContextListener
。在此答案中可以找到更多详细信息。
或者,当您已经在支持EJB 3.1(JBoss AS 6,GlassFish 3,但不是Tomcat 7)的Java EE 6容器上时,最简单的方法是使用@Schedule
方法创建一个@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 小时运行一次任务,请使用前面链接的答案中提供的示例,并在 scheduleAtFixedRate()
方法中进行以下更改
scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS);
该类必须实现 Runnable
,并且实际作业需要在@Override
的 run()
方法中完成,如链接答案中的示例所示。UpdateSubscriptions