参考 https://www.imooc.com/video/15144
1.设计模式
builder模式、Factory模式、组件模式、链式写法
2.三个核心概念
(1)调度器
(2)任务
(3)触发器
3.体系结构
(1)JobDetail:包含任务的实现类以及类的信息
(2)trigger:决定任务器什么时候被调用
分为SimpleTrigger(类似timer的作用,例如在一个指定的时间段内执行一次作业任务或在指定的时间间隔内多次执行);
CornTrigger(基于日历的作业调度器,例如每天执行一次);
//创建一个Trigger实例,定义该Job立即执行,并且每5秒执行一下,不断重复下去 CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger().withIdentity( "myTrigger","group1" ).startNow().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *")).build();
Scheduler(调度器)
(3)Job(定义执行任务)
4.第一个quartz程序
maven引入
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
新建HelliJob类
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.print("当前时间: "+simpleDateFormat.format(new Date()));
System.out.print("Hello Word!");
}
}
新建定时器类
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException{
//创建一个JobDetail实例,与Hello.calss绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity(
"myJob","group1"
).build();
//创建一个Trigger实例,定义该Job立即执行,并且每5秒执行一下,不断重复下去
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(
"myTrigger","group1"
).startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
//创建Scheduler实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trigger);
//打印当前时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.print("当前定时时间: "+simpleDateFormat.format(new Date()));
}
}
5.JobDataMap
(1)在进行任务调度时JobDataMap存储在JobExecutionContext中,方便获取
(2)JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时这些参数
对象会传递给它
(3)JobDataMap实现了JDK的Map接口,并添加了一些方法用来存取基本数据类型
(4)获取JobDataMap的两种方式
第一种 : 在 HelloScheduler中
//创建一个JobDetail实例,与Hello.calss绑定 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity( "myJob","group1" ).usingJobData("message","hello myJob1").usingJobData("FloatJobValue",3.14F).build(); //创建一个Trigger实例,定义该Job立即执行,并且每5秒执行一下,不断重复下去 Trigger trigger = TriggerBuilder.newTrigger().withIdentity( "myTrigger","group1" ).startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()). usingJobData("message","hello myJob2").usingJobData("DoubleJobValue",3.1D).build();
在HelloJob中,通过 JobExecutionContext 去获取对应的值
JobKey key = jobExecutionContext.getJobDetail().getKey(); TriggerKey key1 = jobExecutionContext.getTrigger().getKey(); System.out.print("jobDetail:"+key.getName()+key.getGroup()); System.out.print("trigger:"+key1.getName()+key1.getGroup()); JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap(); JobDataMap jobDataMap1 = jobExecutionContext.getTrigger().getJobDataMap(); String jboMsg = jobDataMap.getString("message"); String jboMsg1 = jobDataMap1.getString("message"); System.out.print(jboMsg); System.out.print(jboMsg1);
第二种:Job实现类中添加srtter方法对应JobDataMap的键值(Quartz
框架默认的JobFactory实现类在初始化job实例对象时自动调用这些setter方法)
例如 直接在HelloJob中写HelloScheduler中的key (message)的get set方法
private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; }
System.out.print("我不信:"+message);
6.
//创建Scheduler实例 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start();
StdSchedulerFactory初始化时会读取默认的quartx.properties文件
属性解析
(1)
org.quartz.scheduler.instanceName:用来区分特定的调度器实例,可以按照给你
用途来给调度器起名。
org.quartz.scheduler.instanceId:和name一样的
功能,但是这个值是在所有调度器实例中是唯一的