`
须等待
  • 浏览: 212780 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Quartz的故障恢复

阅读更多

     在默认的情况下,Quartz中所提交的任务都是独立的运行在内存中的线程,这意味着一旦机器出现故障或任何原因这个线程被干掉,那么提交的任务就无法继续也无法恢复。如果我们想要在系统出现故障的情况下恢复Quartz中的任务,就要把当前任务状态持久化,然后在系统恢复之后恢复任务的执行,这就是基本的解决思路。Quartz在这方面也提供了支持。

 

     首先,持久化的问题。要进行恢复就要将任务进行的状态保存下来,Quartz内置了数据库持久化的模块,我们要做的只是在配置文件中增加数据源,并在数据库中手动建好表就可以了。在%Quartz_HOME%/docs/dbTables目录下有大部分数据的建表语句,可以直接拿到数据库中进行建表操作。

 

 

org.quartz.jobStore.misfireThreshold=60000
org.quartz.dataSource.DATA_SOURCE_NAME.driver=com.mysql.jdbc.Driver
org.quartz.dataSource.DATA_SOURCE_NAME.URL=jdbc:mysql://host:port/dbname
org.quartz.dataSource.DATA_SOURCE_NAME.user=root
org.quartz.dataSource.DATA_SOURCE_NAME.password=
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource=DATA_SOURCE_NAME

    配置好以后再启动Quartz,就会发现提交的任务在相应的数据库表中可以找到,Quartz已经把任务的状态都记录下来了。

 

    剩下的恢复操作就很简单了,我们只要设置一个监听器(Tomcat、Spring中都有类似的模块,如果没有用到Tomcat、Spring的话也可以在自己的系统中设置启动的入口),在系统启动的时候去数据库中找到提交的任务,然后重新交给Quartz去管理就可以了。JobDetail类中有requestsRecovery属性,默认是false,当设置为true时,重新提交之后Quartz会检测当前的任务时候错过了应该触发的时间,如果错过了会立即触发一个任务。

 

    对于有状态的任务,如果需要保存任务中所传递的参数,则需要让工作类实现StateFulJob接口,这样Quartz在进行持久化的时候会把参数也保存下来,以便恢复。

 

    在系统启动的时候,启动quartz,quartz就会从数据库里恢复之前持久化的任务信息,错过触发时间,trigger有一系列的应对策略,这里在声明触发器的时候要设置好,如trigger.setMisfireInstruction(Trigger.INSTRUCTION_RE_EXECUTE_JOB);

 

public void recovery() {
        Scheduler scheduler = null;

        try {
            SchedulerFactory sf = new StdSchedulerFactory();
            scheduler = sf.getScheduler();

            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

 

 

 

PS: 评论里有同学说设置了requestsRecovery属性以后不需要重新提交,LZ作了 测试,确实是这样的,Quartz启动的时候会自动把持久化的任务提取出来执行,scheduler.rescheduleJob这个方法是用来以当前时间为基准来调整下一次触发的时间。如果没有调用这个方法的话,恢复的任务会假设自己处在系统退出前的时间,把错过的执行次数一次性全部执行一遍。

 

 

 

 

 

 

 

4
2
分享到:
评论
18 楼 须等待 2013-12-09  
heathcliffchen 写道
StdSchedulerFactory schFac = new StdSchedulerFactory();
Scheduler scheduler = schFac.getScheduler();
scheduler.start();

我按上面的写了后,为什么没见数据库的已有的任务自动开始调度

怎样在系统启动的时候去数据库中找到提交的任务,然后重新交给Quartz去管理?


配置文件里有一条是选择任务的持久化方式,这里要设置好quartz把任务持久化到数据库,你系统启动的时候启动quartz就会自动去数据库里把持久化的任务拿出来,该重跑的重跑,该调度的调度
17 楼 heathcliffchen 2013-12-09  
StdSchedulerFactory schFac = new StdSchedulerFactory();
Scheduler scheduler = schFac.getScheduler();
scheduler.start();

我按上面的写了后,为什么没见数据库的已有的任务自动开始调度

怎样在系统启动的时候去数据库中找到提交的任务,然后重新交给Quartz去管理?
16 楼 heathcliffchen 2013-12-09  
StdSchedulerFactory schFac = new StdSchedulerFactory();
Scheduler scheduler = schFac.getScheduler();
scheduler.start();

我按上面的写了后,为什么没见数据库的已有的任务自动开始调度
15 楼 须等待 2013-05-29  
liaochengfeng 写道
十分感谢, 关于次数计算, 我发现触发器每次的触发时间不那么准确,有时会有些偏差, 所以有点担心,以最后触发时间计算错过次数,会不那么准确


多线程环境下时间点误差是无法避免的额。。
14 楼 liaochengfeng 2013-05-29  
十分感谢, 关于次数计算, 我发现触发器每次的触发时间不那么准确,有时会有些偏差, 所以有点担心,以最后触发时间计算错过次数,会不那么准确
13 楼 须等待 2013-05-29  
liaochengfeng 写道
你好,我已配置好持久化,并设置了JobDetail的RequestsRecovery属性为true。
但是目前的现象是, 停机时错过多次任务的触发,但是重启后只恢复了一次。
请问,怎样才能达到 “把错过的执行次数一次性全部执行一遍。”呢?

谢谢了


我映像中quartz应该是在启动的时候检查数据库里持久化的任务发现错过了就执行,并不会去计算错过多少次,你可以在任务被触发的时候手动检查一下上次触发的时间,然后自己去计算错过了多少次,然后根据你自己的业务来手动触发任务
12 楼 liaochengfeng 2013-05-29  
你好,我已配置好持久化,并设置了JobDetail的RequestsRecovery属性为true。
但是目前的现象是, 停机时错过多次任务的触发,但是重启后只恢复了一次。
请问,怎样才能达到 “把错过的执行次数一次性全部执行一遍。”呢?

谢谢了
11 楼 Shen.Yiyang 2012-11-20  
须等待 写道
Shen.Yiyang 写道
须等待 写道
Shen.Yiyang 写道
如果你的job已经是requestsRecovery,难道quartz不会自动recover吗?还需要重新提交?

好吧,看来我之前的理解还是有偏差,我作了一些测试:即使没有requestsRecovery属性,只要配置了持久化信息,Quartz都会把Job的信息存如数据库,并且在启动的时候恢复数据库中的所有任务。

我说重新提交指的是scheduler.rescheduleJob(t, groupName, trigger);  方法,这个方法会以当前时间为基准调整下次触发的时间,不调用也可以恢复任务,但是这时恢复的任务会假设自己还是处在系统退出前的时间状态,会把错误的没有执行的次数一次性执行一遍。

  如果你的requestsRecovery是false,并且你没有rescheduleJob,难道quartz不会以现在为基准,去触发下一次?

不仅仅是触发下一次,是触发很多个下一次,执行(now-last)/period次

我这样问好了,如果没有reschedule,也没有requestsRecovery,但是job已经存在数据库了,服务器重启以后quartz会怎么运行,和你的reschedule有什么不同?
10 楼 须等待 2012-11-20  
Shen.Yiyang 写道
须等待 写道
Shen.Yiyang 写道
如果你的job已经是requestsRecovery,难道quartz不会自动recover吗?还需要重新提交?

好吧,看来我之前的理解还是有偏差,我作了一些测试:即使没有requestsRecovery属性,只要配置了持久化信息,Quartz都会把Job的信息存如数据库,并且在启动的时候恢复数据库中的所有任务。

我说重新提交指的是scheduler.rescheduleJob(t, groupName, trigger);  方法,这个方法会以当前时间为基准调整下次触发的时间,不调用也可以恢复任务,但是这时恢复的任务会假设自己还是处在系统退出前的时间状态,会把错误的没有执行的次数一次性执行一遍。

  如果你的requestsRecovery是false,并且你没有rescheduleJob,难道quartz不会以现在为基准,去触发下一次?

不仅仅是触发下一次,是触发很多个下一次,执行(now-last)/period次
9 楼 zhongliangjun1 2012-11-20  
hot66hot 写道
看看项目中使用Quartz集群分享.
传送门:http://hot66hot.iteye.com/blog/1726143

优质链接,马一个了~
8 楼 Shen.Yiyang 2012-11-20  
须等待 写道
Shen.Yiyang 写道
如果你的job已经是requestsRecovery,难道quartz不会自动recover吗?还需要重新提交?

好吧,看来我之前的理解还是有偏差,我作了一些测试:即使没有requestsRecovery属性,只要配置了持久化信息,Quartz都会把Job的信息存如数据库,并且在启动的时候恢复数据库中的所有任务。

我说重新提交指的是scheduler.rescheduleJob(t, groupName, trigger);  方法,这个方法会以当前时间为基准调整下次触发的时间,不调用也可以恢复任务,但是这时恢复的任务会假设自己还是处在系统退出前的时间状态,会把错误的没有执行的次数一次性执行一遍。

  如果你的requestsRecovery是false,并且你没有rescheduleJob,难道quartz不会以现在为基准,去触发下一次?
7 楼 须等待 2012-11-20  
coffeesweet 写道
呵呵,我觉得说的挺仔细的,算作自己学习的文章吧,挺好,一点一点慢慢积累。

6 楼 coffeesweet 2012-11-20  
呵呵,我觉得说的挺仔细的,算作自己学习的文章吧,挺好,一点一点慢慢积累。
5 楼 Bsklqgy 2012-11-20  
    
4 楼 须等待 2012-11-20  
Shen.Yiyang 写道
如果你的job已经是requestsRecovery,难道quartz不会自动recover吗?还需要重新提交?

好吧,看来我之前的理解还是有偏差,我作了一些测试:即使没有requestsRecovery属性,只要配置了持久化信息,Quartz都会把Job的信息存如数据库,并且在启动的时候恢复数据库中的所有任务。

我说重新提交指的是scheduler.rescheduleJob(t, groupName, trigger);  方法,这个方法会以当前时间为基准调整下次触发的时间,不调用也可以恢复任务,但是这时恢复的任务会假设自己还是处在系统退出前的时间状态,会把错误的没有执行的次数一次性执行一遍。
3 楼 freezingsky 2012-11-19  
我以为是讲什么新鲜的。
2 楼 hot66hot 2012-11-19  
看看项目中使用Quartz集群分享.
传送门:http://hot66hot.iteye.com/blog/1726143
1 楼 Shen.Yiyang 2012-11-19  
如果你的job已经是requestsRecovery,难道quartz不会自动recover吗?还需要重新提交?

相关推荐

    Quartz

    - **故障恢复机制**:在任务执行过程中遇到严重错误时,能够通知应用系统,并尝试重新执行。 #### 三、Quartz的工作原理 Quartz的核心概念包括Job和Trigger。Job代表需要执行的任务本身,而Trigger则是控制Job何时...

    Quartz.net 3.0.7.0数据库持久化.rar

    Quartz.NET 3.0.7.0通过数据库持久化保证了任务调度的可靠性,即使在系统故障后也能恢复。同时,它的集群功能提供了高可用性和负载均衡,可以有效防止单点故障。通过C# API,开发者可以方便地创建、管理和调度复杂的...

    Quartz.NET 官方源码及演示例子

    - **阅读文档**:`doc`目录中的文档可以帮助理解Quartz.NET的高级特性,如集群支持、并发控制和故障转移。 通过以上步骤,你可以全面掌握Quartz.NET的使用和开发,不仅能够利用它为你的应用程序添加定时任务功能,...

    SpringBoot 整合Quartz(集群)实现定时任务调度

    SpringBoot整合Quartz实现定时任务调度是企业级应用中常见的需求,主要用于自动化执行某些周期性的...在集群环境中,通过配置和Quartz的内置机制,我们可以实现任务的分布式执行和故障恢复,提高系统的稳定性和可靠性。

    Quartz.net-定时任务 Demo

    6. **集群与故障转移**: Quartz.NET还支持集群配置,可以在多台服务器上运行,当一台服务器宕机时,其他服务器可以接管任务执行,提供高可用性。 7. **API和配置**: Quartz.NET提供了丰富的API和XML配置选项,可以...

    quartz的持久化

    4. **故障恢复**:在系统故障后,调度器重新启动时,会从持久化存储中恢复所有作业和触发器,继续执行计划的任务。 博客链接中提到的可能是通过 `Microsoft Office Visio` 创建的流程图或架构图,但具体内容无法从...

    quartz-1.4.5以及源码

    6. **持久化**:Quartz的作业和触发器可以通过JDBCJobStore持久化到数据库中,这样即使在服务器故障后,也能恢复作业状态。 源码分析: 通过`quartz-1.4.5-sources.jar`,我们可以深入理解Quartz的内部工作原理。...

    任务调度框架Quartz

    2.持久化机制:Quartz 提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。 3.组件式设计:Quartz 提供了组件式的侦听器、各种插件、线程池等功能,可以...

    SpringQuartz的使用文档

    Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时具备调度状态的持久化能力,即使在系统故障后也能恢复调度。 Spring对Quartz进行了集成,使其更易于在Spring应用程序中使用。Spring...

    quartz 集群解决方法

    6. **故障转移和恢复**: 当一个正在运行的节点突然失效时,Quartz集群应该能够自动检测并重新安排该节点上的任务到其他存活的节点。这需要正确配置`org.quartz.jobStore.misfireThreshold`,以决定何时认为一个...

    quartz-2.3.0.rar

    这些脚本的使用使得在系统重启后,Quartz能够恢复之前调度的状态,确保任务的连续性和可靠性。 Quartz的多数据库SQL支持意味着它可以无缝地集成到各种数据库环境中,只需选择与你正在使用的数据库对应的SQL脚本进行...

    Quartz-1.8.4官方

    3. **集群支持**:Quartz可以在多台服务器上运行,形成一个集群,这样即使有一台服务器出现故障,任务调度仍能继续进行,确保了服务的高可用性。 4. **插件化设计**:Quartz提供了一个可扩展的插件架构,允许开发者...

    quartz支持集群的定时器任务

    - **优点**:高可用性、故障恢复、负载均衡、可扩展性。 - **挑战**:数据库压力、集群同步延迟、配置复杂性。 7. **最佳实践** - **适当设计Job和Trigger**:避免过于频繁的调度,减少数据库交互。 - **监控与...

    quartz定时任务所用jar包

    - Quartz支持多节点集群,确保任务在任何节点故障时仍能执行。 - 使用共享的Job存储(如JDBCJobStore)和集群配置来实现高可用性。 8. **插件与扩展**: - Quartz提供了多种插件,如EmailPlugin用于发送报警邮件...

    Quartz定时任务持久化数据表

    8. `QRTZ_FIRED_TRIGGERS`、`QRTZ_PAUSED_TRIGGER_GRPS`:这两个表用于跟踪已触发和暂停的触发器,以支持恢复和故障转移。 使用这些数据库表,你可以通过简单的CRUD操作来管理和控制Quartz的定时任务。例如,创建新...

    Quartz持久化资料大全

    1. 任务恢复:当系统发生故障或重启时,能够恢复之前设置的任务,保证任务的连续性。 2. 资源优化:将任务状态保存在数据库中,减少内存压力,提高系统的稳定性和可靠性。 二、Quartz持久化方式 Quartz支持多种持久...

    官方 Quartz 2.2.2 Jar 包

    Terracotta 提供了分布式内存管理和故障恢复功能,使得 Quartz 能够在多服务器环境中无缝工作,确保高可用性和容错性。 5. **Getting_Started_with_Quartz_Scheduler.pdf**:入门指南是新用户的理想起点,它简明...

    定时器quartz API文档

    7. **持久化**:Quartz支持通过JDBC JobStore实现数据持久化,这样即使应用程序重启,Job和Trigger的状态也能被恢复,保证任务的连续性。 8. **并发与集群**:Quartz允许在多台服务器上部署同一个Scheduler实例,...

    quartz界面化持久化管理

    - `Scheduler`的`pauseJob(JobKey)`和`resumeJob(JobKey)`用于暂停或恢复特定Job的执行。 8. **集成Spring**: - 可以通过Spring的`@Configuration`和`@Bean`注解,将Quartz集成到Spring应用上下文中,简化配置和...

Global site tag (gtag.js) - Google Analytics