在默认的情况下,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这个方法是用来以当前时间为基准来调整下一次触发的时间。如果没有调用这个方法的话,恢复的任务会假设自己处在系统退出前的时间,把错过的执行次数一次性全部执行一遍。
相关推荐
- **故障恢复机制**:在任务执行过程中遇到严重错误时,能够通知应用系统,并尝试重新执行。 #### 三、Quartz的工作原理 Quartz的核心概念包括Job和Trigger。Job代表需要执行的任务本身,而Trigger则是控制Job何时...
Quartz.NET 3.0.7.0通过数据库持久化保证了任务调度的可靠性,即使在系统故障后也能恢复。同时,它的集群功能提供了高可用性和负载均衡,可以有效防止单点故障。通过C# API,开发者可以方便地创建、管理和调度复杂的...
- **阅读文档**:`doc`目录中的文档可以帮助理解Quartz.NET的高级特性,如集群支持、并发控制和故障转移。 通过以上步骤,你可以全面掌握Quartz.NET的使用和开发,不仅能够利用它为你的应用程序添加定时任务功能,...
SpringBoot整合Quartz实现定时任务调度是企业级应用中常见的需求,主要用于自动化执行某些周期性的...在集群环境中,通过配置和Quartz的内置机制,我们可以实现任务的分布式执行和故障恢复,提高系统的稳定性和可靠性。
6. **集群与故障转移**: Quartz.NET还支持集群配置,可以在多台服务器上运行,当一台服务器宕机时,其他服务器可以接管任务执行,提供高可用性。 7. **API和配置**: Quartz.NET提供了丰富的API和XML配置选项,可以...
4. **故障恢复**:在系统故障后,调度器重新启动时,会从持久化存储中恢复所有作业和触发器,继续执行计划的任务。 博客链接中提到的可能是通过 `Microsoft Office Visio` 创建的流程图或架构图,但具体内容无法从...
6. **持久化**:Quartz的作业和触发器可以通过JDBCJobStore持久化到数据库中,这样即使在服务器故障后,也能恢复作业状态。 源码分析: 通过`quartz-1.4.5-sources.jar`,我们可以深入理解Quartz的内部工作原理。...
2.持久化机制:Quartz 提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。 3.组件式设计:Quartz 提供了组件式的侦听器、各种插件、线程池等功能,可以...
Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时具备调度状态的持久化能力,即使在系统故障后也能恢复调度。 Spring对Quartz进行了集成,使其更易于在Spring应用程序中使用。Spring...
6. **故障转移和恢复**: 当一个正在运行的节点突然失效时,Quartz集群应该能够自动检测并重新安排该节点上的任务到其他存活的节点。这需要正确配置`org.quartz.jobStore.misfireThreshold`,以决定何时认为一个...
这些脚本的使用使得在系统重启后,Quartz能够恢复之前调度的状态,确保任务的连续性和可靠性。 Quartz的多数据库SQL支持意味着它可以无缝地集成到各种数据库环境中,只需选择与你正在使用的数据库对应的SQL脚本进行...
3. **集群支持**:Quartz可以在多台服务器上运行,形成一个集群,这样即使有一台服务器出现故障,任务调度仍能继续进行,确保了服务的高可用性。 4. **插件化设计**:Quartz提供了一个可扩展的插件架构,允许开发者...
- **优点**:高可用性、故障恢复、负载均衡、可扩展性。 - **挑战**:数据库压力、集群同步延迟、配置复杂性。 7. **最佳实践** - **适当设计Job和Trigger**:避免过于频繁的调度,减少数据库交互。 - **监控与...
- Quartz支持多节点集群,确保任务在任何节点故障时仍能执行。 - 使用共享的Job存储(如JDBCJobStore)和集群配置来实现高可用性。 8. **插件与扩展**: - Quartz提供了多种插件,如EmailPlugin用于发送报警邮件...
8. `QRTZ_FIRED_TRIGGERS`、`QRTZ_PAUSED_TRIGGER_GRPS`:这两个表用于跟踪已触发和暂停的触发器,以支持恢复和故障转移。 使用这些数据库表,你可以通过简单的CRUD操作来管理和控制Quartz的定时任务。例如,创建新...
1. 任务恢复:当系统发生故障或重启时,能够恢复之前设置的任务,保证任务的连续性。 2. 资源优化:将任务状态保存在数据库中,减少内存压力,提高系统的稳定性和可靠性。 二、Quartz持久化方式 Quartz支持多种持久...
Terracotta 提供了分布式内存管理和故障恢复功能,使得 Quartz 能够在多服务器环境中无缝工作,确保高可用性和容错性。 5. **Getting_Started_with_Quartz_Scheduler.pdf**:入门指南是新用户的理想起点,它简明...
7. **持久化**:Quartz支持通过JDBC JobStore实现数据持久化,这样即使应用程序重启,Job和Trigger的状态也能被恢复,保证任务的连续性。 8. **并发与集群**:Quartz允许在多台服务器上部署同一个Scheduler实例,...
- `Scheduler`的`pauseJob(JobKey)`和`resumeJob(JobKey)`用于暂停或恢复特定Job的执行。 8. **集成Spring**: - 可以通过Spring的`@Configuration`和`@Bean`注解,将Quartz集成到Spring应用上下文中,简化配置和...