我希望在每6小时后从订阅中检索订阅和将订阅源存储到数据库。我想在后台有一个计时器线程来完成这项任务。JSP/Servlet Web应用程序中的后台计时器任务
最好的方法是什么?一个普通的定时器线程或Quartz API?
我希望在每6小时后从订阅中检索订阅和将订阅源存储到数据库。我想在后台有一个计时器线程来完成这项任务。JSP/Servlet Web应用程序中的后台计时器任务
最好的方法是什么?一个普通的定时器线程或Quartz API?
首先,我不会为此使用JSP。那里不适合。
当您使用Java EE 5时,请使用容器提供的jobscheduling API。进一步的细节取决于你使用的容器。例如JBoss AS 5带有Quartz。或者当您在提供jobscheduling API的JSP/Servlet之上使用框架时,如Spring,那么您应该使用它。
如果没有(例如,您只使用Tomcat 6),或者您希望独立于容器和/或框架,请使用ScheduledExecutorService
创建一个ServletContextListener
。更多细节可在this answer中找到。
或者当你已经在支持EJB 3.1的Java EE 6容器(JBoss AS中6,GlassFish的3,但这样不的Tomcat 7),最简单的就是创建一个@Singleton
EJB与@Schedule
方法。
@Singleton
public class UpdateSubscriptions {
@Schedule(hour="*/6", minute="0", second="0", persistent=false)
public void run() {
// Do your job here.
}
}
就是这样。不需要进一步的配置。
更新:根据意见,你使用的是Tomcat(6或7?)。要启动它运行的任务,每6小时Web应用程序的启动过程中一个线程,使用示例作为beforelinked answer提供,并在scheduleAtFixedRate()
方法
scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS);
以下更改类UpdateSubscriptions
必须实现Runnable
和实际工作需要,需要在run()
方法中完成,您可以使用@Override
,如链接答案中的示例。
+1无法获得比这更完美的答案。 – asgs 2011-03-18 21:17:00
我只使用Tomcat。我也看到了相关的答案。我打算在课堂上使用它,结果不会使用JSP。但是,servlet是更好的方法吗? 2.如果我把它放在一个servlet中,如链接答案中所示,它会不会每6小时创建一个新线程? – MalTec 2011-03-19 12:20:22
这不是一个servlet。这是一个倾听者。并且在webapp的生命周期中只有它的一个实例(顺便说一句,这同样适用于servlet)。 – BalusC 2011-03-19 13:10:44