在默认的情况下,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这个方法是用来以当前时间为基准来调整下一次触发的时间。如果没有调用这个方法的话,恢复的任务会假设自己处在系统退出前的时间,把错过的执行次数一次性全部执行一遍。
相关推荐
Spring Quartz 动态暂停、恢复、修改定时任务的一个demo,使用maven构建,框架采用spring springmvc jpa,数据库mysql,含数据库脚本,运行可用,页面访问地址http://localhost:8080/quartz_demo/quartz/list
文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...
quartz简单实例quartz简单实例quartz简单实例quartz简单实例
赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...
该压缩包内包含两个quartz的jar包, 分别是quartz-1.6.0.jar和quartz-all-1.6.0.jar
ssm整合quartz 并持久化到数据库中,实现动态增删改查,暂停任务,恢复任务等 将链接内的target文件直接放到项目ssmquartztest文件夹下 运行环境: jdk5+tomcat7+mysql+eclipse+maven lib jar包下载地址 地址1:...
quartz-2.2.3版本的quartz初始化sql语句
赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...
lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子
Quartz1.5,Quartz1.6,Quartz1.8。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个...
quartz quartz-1.8.6 dbTables quartz动态任务调度需要的数据库脚本。
Quartz使用方法Quartz使用方法Quartz使用方法Quartz使用方法Quartz使用方法
Quartz.NET框架的核心是调度器。调度器负责管理Quartz.NET应用运行时环境。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz.NET采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器...
quartz内部表.sql。
Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例
quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则
在 myeclipse6.0.1下调试成功可直接运行的spring的quartz的例子,很适合刚接触quartz调度学习。
Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。 Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的...
quartz-2.2.1 最新包
Autofac.Extras.Quartz, Quartz.Net的Autofac集成 Autofac.Extras.Quartz用于 Quartz.Net的Autofac集成包。Autofac.Extras.Quartz 为每个石英作业创建嵌套的litefime作用域。 完成作业执行后释放嵌套作用域。这允许...