本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Quartz任务调度
1、Quartz概念
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE、J2SE应用程序相结合或单独使用。
Quartz是开源且具有丰富特性的”==任务调度库==“,能够集成任何的Java应用、能够创建简单或复杂的调度、任务Job被定义为标准的Java组建,能够执行任何想要实现的功能、还有JTA事务、集群的支持等。
2、Quartz运行环境
- Quartz 可以运行嵌入在另一个独立式应用程序。
- Quartz 可以在应用程序服务器(或servlet容器)内被实例化,并且参与事务。
- Quartz 可以作为一个独立的程序运行(在其自己的Java虚拟机内),可以通过RMI使用。
- Quartz 可以被实例化,作为独立的项目集群(负载平衡和故障转移功能),用于作业的执行。
3、Quartz设计模式
- Builder模式:所有关键组件都由Builder模式构建,如:JobBuilder、TriggerBuilder。
- Factory模式:最终由Scheduler(调度器实例)来进行组合各种组件 ,如:StdSchedulerFactory。
- 组件模式:Quartz项目中大量使用组件模式,插件式设计,可插拔、低耦合、易扩展,开发者可自行定义自己的JobDetail(任务)、Trigger(触发器)、Scheduler(调度器)等组件。
- 链式编程:Quartz中大量使用链式写法,与jQuery的写法有几分相似,实现也比较简单
1、$(this).addClass("divCurrColor").next(".divContent").css("display","block") 2、newTrigger().withIdentity("trigger3","group1").startAt(startTime) .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
4、Quartz学习的核心概念
-
Job(任务):Job就是想要实现的任务类,每一个Job必须实现org.quartz.job接口,且只需实现接口定义的execute()方法。
-
Trigger(触发器):Trigger为执行任务的触发器,例如每天3点发送一份统计邮件,Trigger将会设置3点进行执行该任务。 Trigger主要包含两种SimpleTrigger和CronTrigger两种。
-
Scheduler(调度器):Scheduler为任务的调度器,它会将任务Job及触发器Trigger整合起来,负责基于Trigger设定的时间来执行Job。
5、Quartz体系结构
graph TD
A[JobD 任务] --> B(scheduler 调度器)
A1[JobDetail ] --> A
A2[JobDataMap ] --> A
C[Triggrt 触发器] --> B(scheduler 调度器)
C1[SimpleTrigger] --> C
C2[CronTrigger] --> C
C3[CalendarIntervalTrigger] --> C
C4[DailyTimeIntervalTrigger] --> C
B --> D1[start]
B --> D2[stop]
B --> D3[pause]
B --> D4[resume]
B --> D5[...]
6、Quartz的几个常用API
-
Scheduler 用于与调度程序交互的主程序接口。 Scheduler 调度程序 - 任务执行计划表,只有安排进执行计划的任务Job(通过scheduler.schedulerjob方法安排进执行计划),当它预先定义的执行时间到了的时候(任务触发trigger),该任务才会执行。
-
Job 是预定义在未来时间能被调度程序执行的任务类(可自定义)
-
JobDetail 使用JobDetail来定义定时任务的实例,JobDetail实例是通过JobBuilder类创建的
-
JobDataMap 可以包含不限量的(序列化的)数据对象,在job实例执行的时候,可以使用其中的数据;JobDataMap是java map接口的一个实现,额外增加了一些便于存储基本类型的数据的方法。
-
Trigger 触发器,Trigger对象是用来触发执行Job的。当调用一个job时,实例一个触发器然后调整它的属性类满足job执行的条件。表明任务在什么时候会执行。定义了一个已经被安排的任务将会在什么时候执行的时间条件,比如每2秒执行一次。
-
JobBuilder 用于声明一个任务实例,也可以定义关于该任务的详情,比如任务名、组名等,这个声明的实例将会作为一个实际执行的任务。
-
TriggerBuilder 触发器创建器,用于创建触发器trigger实例。
-
JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听。