定时任务设计(二):Quartz

来源:互联网 发布:大数据考证 编辑:程序博客网 时间:2024/05/21 17:10

核心接口和类

Scheduler接口:调度器接口,包含任务的调度管理;

Job接口:自定义的“定时程序”实现此接口的
void execute(JobExecutionContext arg0)方法,Job还有一类为有状态的StatefulJob接口,如果我们需要在上一个作业执行完后,根据其执行结果再进行下次作业的执行,则需要实现此接口。

JobDetail类:具体某个定时程序的详细描述,包括Name,Group,JobDataMap等。

JobDataMap类:用于描述一个作业的参数,参数可以为任何基本类型例如String,float等,也可为某个对象的引用.

Trigger抽象类:调度类(Scheduler)在时间到时调用此类,再由trigger类调用指定的定时程序。
Quertz中提供了两类触发器为:
- SimpleTrigger
简单的定时功能
- CronTrigger
使用表达式来描述定时功能,因此适用于比较复杂的定时描述,
例如每个月的最后一个周五,每周的周四等。

JobExecutionContext类:定时程序执行的run-time的上下文环境,用于得到当前执行的Job的名字,配置的参数等。

JobListener,TriggerListener接口:用于监听触发器状态和作业扫行状态,在特写状态执行相应操作。

Quartz任务调度设计:

这里写图片描述

  • Job与Trigger解藕,实现N个任务和M个触发规则自由组合;

  • Scheduler扮演“指挥官”的角色,统筹调度。对触发规则进行全面的管理,例如优先级、错失触发、线程分配等等:

配置

默认加载顺序:
优先顺序 Classpath:quartz.properties –> org/quartz/quartz.properties (quartz lib)

#调度器名,默认名是QuartzScheduler,集群下要求相同org.quartz.scheduler.instanceName = Scheduler1    org.quartz.scheduler.instanceId = AUTO#配置线程池org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount = 10org.quartz.threadPool.threadPriority = 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true#配置任务存储方式org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore #或者,使用数据库存储,集群必须使用org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegateorg.quartz.jobStore.tablePrefix = QRTZ_org.quartz.jobStore.maxMisfiresToHandleAtATime = 10#漏发处理时间阈值org.quartz.jobStore.misfireThreshold = 60000#集群配置org.quartz.jobStore.isClustered = true  org.quartz.jobStore.clusterCheckinInterval = 20000

集群

架构:

这里写图片描述

  • LB:谁先触发谁执行,并且一次只有一个scheduler触发。
  • 故障处理Fail-Over : 当一个scheduler失败后,其它的实例可以发现那些执行失败的Jobs,假如Job对应的JobDetail标记为recovery(属性”requests recovery”),那么该Job就会被其它的实例重新执行,否则对应的Job只会被释放等待下次被触发。

数据模型

这里写图片描述

主要表描述

这里写图片描述

线程模型

这里写图片描述

注意点:

  1. 不在不同的机器上实现集群功能,除非他们的时钟同步精确到秒
  2. 不实现集群的实例不使用同一套表