Quartz简介
特点:
- 强大的调度功能
- 灵活的应用方式
- 分布式和集群能力
主要用到的设计模式
- Builder模式
- Factory模式
- 组件模式
- 链式写法
三个核心概念
- 调度器
- 任务
- 触发器
第一个Quartz程序
/**
* @author hukai
* @since 2021-11-30
*/
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//执行重复的业务方法'
Date date = new Date();
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("时间为"+sf.format(date));
}
}
/**
* @author hukai
* @since 2021-11-30
*/
public class Test {
public static void main(String[] args) throws SchedulerException {
//创建一个JobDetail实例,将该实例与helloJob类绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
//创建一个Trigger实例,定义该Job立即执行,并且每隔两秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
//创建一个Scheduler实例
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
//打印当前时间
Date date = new Date();
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("第一次时间为"+sf.format(date));
scheduler.scheduleJob(jobDetail,trigger);
}
}
浅谈Job&JobDetail
Job定义
重要属性
-
name
-
group
-
jobClass
-
jobDataMap
获取JobDataMap的两种方式 -
从Map中直接获取
代码演示:
public class Test {
public static void main(String[] args) throws SchedulerException {
//创建一个JobDetail实例,将该实例与helloJob类绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).usingJobData("message","No1")
.usingJobData("float",3.14F)
.withIdentity("myJob", "group1").build();
//创建一个Trigger实例,定义该Job立即执行,并且每隔两秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.usingJobData("message","No2")
.usingJobData("Float",4.3F)
.startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
//创建一个Scheduler实例
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
//打印当前时间
Date date = new Date();
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("第一次时间为"+sf.format(date));
scheduler.scheduleJob(jobDetail,trigger);
}
}
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//执行重复的业务方法'
Date date = new Date();
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("时间为"+sf.format(date));
JobKey key = context.getJobDetail().getKey();
System.out.println("name"+key.getName());
System.out.println("group"+key.getGroup());
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
JobDataMap triggerDataMap = context.getTrigger().getJobDataMap();
System.out.println(jobDataMap.getString("message"));
System.out.println(jobDataMap.getFloat("float"));
System.out.println(triggerDataMap.getString("message"));
System.out.println(triggerDataMap.getFloat("Float"));
}
}
- List item
从成员变量中获取
代码演示:
public class HelloJob implements Job {
private String message;
private Float Myfloat;
private Float ss;
public Float getSs() {
return ss;
}
public void setSs(Float ss) {
this.ss = ss;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Float getMyfloat() {
return Myfloat;
}
public void setMyfloat(Float myfloat) {
Myfloat = myfloat;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//执行重复的业务方法'
Date date = new Date();
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("时间为"+sf.format(date));
JobKey key = context.getJobDetail().getKey();
System.out.println("name"+key.getName());
System.out.println("group"+key.getGroup());
System.out.println(message);
System.out.println(ss);
System.out.println(Myfloat);
}
}
浅谈Trigger
思考:Trigger是什么?
Trigger是Quartz中的触发器,它是用来告诉调度程序作业什么时候触发,即Trigger对象是用来触发执行Job的。
触发器通用属性
- jobKey
- StartTime
- EndTime
SimpleTrigger
作用:在一个指定时间段内执行一次作业任务或是在指定的时间间隔内多次执行作业任务
需要注意的点:
- 重复次数可以为0,正整数或是SimpleTrigger.REPEAT_INDEFINITELY常量值、
- 重复执行间隔必须为0或长整数
- 一旦被指定了endTime参数,那么他会覆盖重复次数参数的效果
public class Test {
public static void main(String[] args) throws SchedulerException {
//创建一个JobDetail实例,将该实例与helloJob类绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).usingJobData("message", "No1")
.usingJobData("Myfloat", 3.14F)
.withIdentity("myJob", "group1").build();
//打印当前时间
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("第一次时间为" + sf.format(date));
Calendar calendar=new GregorianCalendar();
calendar.setTime(date);
calendar.add(Calendar.SECOND,2);
//创建一个Trigger实例,定义该Job立即执行,并且每隔两秒重复执行一次
SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.usingJobData("message", "No2")
.usingJobData("ss", 4.3F)
.startAt(calendar.getTime()).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).withRepeatCount(2)).build();
//创建一个Scheduler实例
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
CronTrigger
作业:基于日历的作业调度器,而不是像SimpleTrigger那样精确指定时间间隔,比SimpleTrigger更常用。
cron表达式
用于配置CronTrigger实例,是由7个子表达式组成的字符串,描述了时间表的详细信息
格式:[秒][分][小时][日][月][周][年]
工作中对于指定的时间cron表达式,没有必要自己去写,网站生成更加方便
https://cron.qqe2.com/
public class Test {
public static void main(String[] args) throws SchedulerException {
//创建一个JobDetail实例,将该实例与helloJob类绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).usingJobData("message", "No1")
.usingJobData("Myfloat", 3.14F)
.withIdentity("myJob", "group1").build();
//打印当前时间
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("第一次时间为" + sf.format(date));
//创建一个Trigger实例,定义该Job立即执行,并且每隔两秒重复执行一次
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 51 17 1 12 ? 2021-2022"))
.build();
//创建一个Scheduler实例
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
浅谈Scheduler
Scheduler-工厂模式
- 所有的Scheduler实例应该由SchedulerFactory来创建的
-
StdSchedulerFactory
- 使用一组参数来创建和初始化Quartz调度器
- 配置参数一般存储在quartz.properties中
- 调用getScheduler方法就能创建和初始化调度器对象
standby()方法挂起后,还是可以通过调用start()方法继续执行!!!而shutdown()是直接停止,并且不能重启会抛出异常
注意:
quartz.properties
-
文档的位置和加载顺序
首先会在本地找有没有这个配置文件,没有的话回去jar包里面去拿默认配置。 -
组成部分:调度器属性、线程池属性、作业存储属性、插件配置