Quartz
- quartz是什么
- quartz能做什么
- quartz的核心API
- 编写代码测试原生的quartz
- quartz的cron表达式
- 整合spring(spring mvc) - 单机版、集群版
- 整合springboot - 单机版 集群版
- springboot整合spring task实现任务调度
1.Quartz是什么?
-
Quartz官方网站:http://www.quartz-scheduler.org
-
Quartz是一个功能丰富的开源任务调度框架,几乎可以集成到任何java应用中,小到单体应用,大到大型电子商务系统;
-
Quartz可以用来执行成千上万的简单或复杂的调度任务;
-
Quartz的任务被定义成一组标准的java组件,几乎可以执行任何编程任务;
-
Quartz包含了一些企业级功能,包括JTA事务和集群;
2.Quartz能做什么?
相当于定时器 某时间点做某一件事
定时调度 定时邮件短信;
定时数据同步 ; 点赞数据一般存在redis定时存到关系型数据库
3.Quartz核心api
1.job:定义一个任务必须要实现的接口
2.jobDetail:用于描述任务 (属于什么任务组。任务名)
3.Trigger:定义任务执行时间、规则
simpleTrigger:定义任务和实质性、何时停止执行拼率
cornTrigger:使用Corn表达式定义执行规则时间
4.Scheduler:调度器(使用Trigger定义的规则调度Job)
5.JobKey:定义任务组和任务名称
6.TriggerKey:定义Trigger组合Trigger名称
7.JobExecutionContext:任务执行上下文
8.JobBuilder、TriggerBuilder
4.使用代码测试SimpleTrigger
1.maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
2.测试任务
- 每隔5秒打印一次hello
- 任务5秒后执行,之后每隔五秒执行一次重复10次
- 任务5秒后执行,之后每隔5秒执行一次,30秒后停止执行
定义任务 HelloJob.java
测试类
创建jobDetail
创建trigger
创建scheduler
定义任务 HelloJob.java
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss SSS");
String current = dateFormat.format(new Date());
System.out.println(current);
}
}
测试一:
//每隔5秒打印一次hello
public class First {
public static void main(String[] args) throws SchedulerException {
//创建jobDetail
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
//任务组 任务名
.withIdentity("hello", "hello").build();
//创建trigger
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("", "")
.startNow()//调度时间:立即执行
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5)//5秒执行一次
.repeatForever()//永远执行
)//任务调度规则
.build();
//创建Scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
}
}
测试二:
//任务5秒后执行,之后每隔五秒执行一次
public class Second {
public static void main(String[] args) throws SchedulerException {
JobKey jobKey = new JobKey("hello", "hello");
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity(jobKey)
.build();
Date current = new Date();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:ss:mm SSS").format(current));
Date fiveSecondsAfter = new Date(current.getTime() + 5000L);
TriggerKey triggerKey = new TriggerKey("hello", "hello");
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerKey)
.startAt(fiveSecondsAfter)//5秒后执行
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5)//每隔5秒执行一次
.withRepeatCount(10)//重复10次
).build();
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}
}
测试三:
//任务5秒后执行,之后每隔5秒执行一次,30秒后停止执行
public class Third {
public static void main(String[] args) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("hello", "hello")
.build();
System.out.println(LocalDateTime.now());
Date date = new Date();
Date fiveSecondsAfter = new Date(date.getTime()+5000L);
Date thirtySecondsAfter = new Date(date.getTime() + 1000*30L);
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("hello")
.startAt(fiveSecondsAfter)
.endAt(thirtySecondsAfter)
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5)
.repeatForever()
).build();
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
}
}
5.Quartz的Cron表达式
5.1 Quartz的Cron表达式(Cron Expression)
-
Quartz的Cron表达式 1.1 Quartz的Cron表达式(Cron Expression)
-
Quartz Cron表达式用于配置CronTrigger实例
[秒] [分] [小时] [天、日期] [月] [周] [年](可选) seconds Minutes Hours Day-of-Month Month Day-of-Week YEAR
时间字段 | 是否必 填 | 取值范围 | 允许的特殊 字符 |
---|---|---|---|
秒 | 是 | 0-59 | , * - / |
分 | 是 | 0-59 | , * - / |
小时 | 是 | 0-23 | , * - / |
天/日期(每月的几 号) | 是 | 1-31 | , * - / ? L W |
月 | 是 | 1-12(JAN-DEC) | , * - / |
周(星期几) | 是 | 1-7(SUN-SAT)(1周天,7 周六) | , * - / ? L # |
年 | 否 | 空、1970-2099 | , * - / |
特 殊 字 符 | 解释 |
---|---|
, | 表示或的关系。如用在分钟:1,5 - 表示在第一分钟和第5分钟执行 |
* | 每秒、每分、每小时、每天、每月等。在秒上写*,表示每秒钟都要执行 |
- | 表示范围。如用在秒上:1-20 - 表示在1-20秒都要执行 |
/ | 表示每隔多长时间执行。用在秒上:*/5或0/5 - 表示每隔5秒执行一次 |
? | 只能用到天和周上 1.如果[天]字段上用了或确切的某一天,那么[周]只能用? 2.如果[周]字段上用了或确切的某一个周几,那么[天]只能用? |
L | 表示每个月的最后一天或者每个月的最后星期几,[周]写6L - 表示每个月 最后一个星期5 |
W | 只能用在[天、日期]的字段,表示离这个日期最近的一个工作日 比如: 1. 25W:表示离这个月25号最近的一个工作日 如果25号是一个工作日,那么就是这天执行 如果25号是周六,那么应该是24号周五执行 如果25号是周天,那么应该是下周一26号执行 2.日期不能夸月 1W:离1号最近的工作日,如果1号是周六,那么离1号最近的工作日 应该是当月3号,而不是上个月的最后一天; 3.只能指定单一日期,不能用范围 |
# | 用在[周]上,表示每个月第几个周几,例如在[周上]写SUN#2 - 表示每个 月第二个周天 母亲节的例子:母亲节当天8点执行一个短信发送任务 0 0 8 ? 5 SUN#2 |
举例 | 表达式 |
---|---|
周一到周五8:50提醒打卡 | 0 50 8 ? * MON-FRI |
每天凌晨1点到1点59分,每隔5分钟执行一次 | 0 0/5 1 * * ? |
每隔5秒执行一次 | */5 * * * * ? |
每天5-15点整点触发 | 0 0 5-15 * * ? |
表示每个星期三中午 | 12点 0 0 12 ? * WED |
每月最后一天23点执行一次 | 0 0 23 L * ? |
每月的最后一个星期五上午10:15触发 | 0 15 10 ? * 6L |
每月的第三个星期五上午10:15触发 | 0 15 10 ? * FRI#3 |
5.2 cron表达式例子
CronTest
public class CronTest {
public static void main(String[] args) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("hello")
.build();
//cron表达式测试每隔五秒执行一次
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("hello")
.withSchedule(
CronScheduleBuilder
.cronSchedule("*/5 * * * * ?")//cron表达式
).build();
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler()