java - JSP/Servlet Web 应用程序中的后台定时器任务

标签 java jsp servlets scheduled-tasks background-process

我想每 6 小时后从订阅中检索和存储订阅源到数据库。我想在后台有一个计时器线程来完成这项任务。

最好的方法是什么?一个普通的定时器线程还是 Quartz API?

最佳答案

首先,我不会为此使用 JSP。它不适合。

当您使用 Java EE 5 时,请为此使用容器提供的作业调度 API。更多细节取决于您使用的容器。例如,JBoss AS 5 附带了 Quartz。或者,当您在 JSP/Servlet 之上使用提供作业调度 API 的框架时,例如 Spring ,那么你应该使用它。

如果没有(例如,您只使用 Tomcat 6),或者您想独立于容器和/或框架,请创建 ServletContextListenerScheduledExecutorService .更多细节可以在 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/

相关文章:

java - 如何使用非空构造函数 Autowiring 类?

java - 如果按下键盘,JOptionPane 会中断扫描仪输入

java - 我的正则表达式有什么问题吗?

java - 如何让Spring访问下拉框值

java - 在 Tomcat 中使用 WebLogic JSP 编译器

jsp - 在struts1.2中如何根据数据库值填充下拉列表

java - JSP::与 session 对象混淆

基于XSD值的Java SAX策略模式

java - 如何将 mx4j httpadaptor 集成到 servlet 中,以便无需使用 ip 和端口启动另一台服务器?

javax.命名.NameNotFoundException | JNDI 查询