简介
使用调度器、触发器完成作业调度
教程:https://blog.csdn.net/oChengXuYuan88/article/details/76583068
使用
Quartz API 主要的接口如下:
- Scheduler - 与调度器交互的主要API。
- Job - 需要被调度器调度的任务必须实现的接口。
- JobDetail - 用于定义任务的实例。
- Trigger - 用于定义调度器何时调度任务执行的组件。
- JobBuilder - 用于定义或创建JobDetail的实例 。
- TriggerBuilder - 用于定义或创建触发器实例。
一个调度器的生命周期起于通过调度器工厂类的创建,止于其对shutdown()方法的调用。调度器创建后,可以添加、删除或列出任务和触发器,也可以执行其他与调度相关的操作(如暂停触发器)。++注意,只有调度器调用了start()方法,才能对响应触发器并调度任务++
两条生产线一条整合线:
1. JobBuilder ——JobDetail——Job
2. TriggerBuilder——Trigger
3. Scheduler将Job和Trigger整合在一起
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
//启动scheduler后才能,trigger才能被触发
sched.start();
// define the job and tie it to our HelloQuartz class HelloQuartz implements interface Job
JobDetail job = newJob(HelloQuartz.class)
.withIdentity("myJob", "group1")
.build();
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
++任务和触发器是多对多的关系,一个任务可以关联多个触发器,一个触发器也可以被多个任务使用.++
Trigger 对象用于触发任务的执行。当需要调度一个任务时,你实例化触发器并根据调度需要设置其属性。触发器也可以有JobDataMap,使其用于对与触发器关联的任务提供参数信息。Quartz 有多种触发器类型,比较常用的是SimpleTrigger 和CronTrigger类型。
- SimpleTrigger类型:需要一个时间点只有一个任务执行或者需要在指定时间出发任务并间隔一定时间重复N次;
- CronTrigger类型:需要基于日历类型的计划表执行任务,例如 每周五的中午、每月第十天的上午10:15 触发任务;
JobDataMap
JobDataMap 对象可以用来在任务执行时提供必要的属性设置信息。这些信息必须是序列化的数据对象。它实现的java中的Map接口,并为基本类型提供了存取数据的简单方法。
// define the job and tie it to our DumbJob class
JobDetail job = newJob(DumbJob.class)
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.usingJobData("jobSays", "Hello World!")
.usingJobData("myFloatValue", 3.141f)
.build();
public class DumbJob implements Job {
public DumbJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
JobKey key = context.getJobDetail().getKey();
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}
}