JobDetail Trigger Scheduler JobDataMap 的使用
1. 基于注解实现
1.1.1 在项目启动类添加@EnableSchedulling
开启定时任务管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling //开启定时任务 public class ScheduledDemoApplication { public static void main(String[] args) { SpringApplication.run(ScheduledDemoApplication.class, args); } }
1.1.2 添加定时任务类,使用@Schedule
开启一个定时任务
1
2
3
4
5
6
7// 也可以使用占位符 // @Schedule(cron="${startTime}") @Schedule(cron="0 30 2 * * ?") public void task() { // do somthing }
1.2 @Schedule
参数详解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33package org.springframework.scheduling.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled { String CRON_DISABLED = "-"; String cron() default ""; String zone() default ""; long fixedDelay() default -1L; String fixedDelayString() default ""; long fixedRate() default -1L; String fixedRateString() default ""; long initialDelay() default -1L; String initialDelayString() default ""; }
1.2.1 cron
该参数接收一个cron表达式
cron 表达式语法:
格式:[秒] [分] [时] [日] [月] [周] [年]
说明 | 是否必填 | 允许填写的值 | 允许的通配符 |
---|---|---|---|
秒 | 是 | 0-59 | , - * / |
分 | 是 | 0-59 | , - * / |
时 | 是 | 0-23 | , - * / |
日 | 是 | 1-31 | , - * / ? L W |
月 | 是 | 1-12 or JAN-DEC | , - * / |
周 | 是 | 1-7 or SUN-SAT | , - * / ? L # |
年 | 否 | [1970-2099] | , - * / |
通配符含义
***** 表示所有值,如秒设置为 ‘*****’,则表示每一秒
, 表示指定多个值,如时设置为 10,20 表示 10点,20点触发
- 表示指定区间,如时设置为 10-20,则表示10点至20点之间,每个小时都会触发
/ 表示递增触发,如分设置为 5/10,则表示从5分开始,每10分钟执行一次
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"
W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 “1W”,它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,“W"前只能设置具体的数字,不允许区间”-")
日和周不能同时表示,需要一个用 ?
2. 手动创建定时任务
定时任务有三个重要组成部分
分别为
-
Schedule 调度器
-
Trigger 触发器
-
JobDetail 具体job
2.1 创建简单定时任务Demo
2.1.1 首先创建类实现Job 接口并重写execute() 方法,作为具体执行类
1
2
3
4
5
6
7
8
9
10
11import org.quartz.Job; public class CustomJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // do something } }
2.1.2 创建触发器
1
2
3
4
5
6
7
8
9
10
11
12
13Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("triggerName", "triggerGroupName") // 触发器信息 .withSchedule(SimpleScheduleBuilder.simpleSchedule() // 指定具体的触发器类型 .withIntervalInSeconds(1)) // 间隔1秒执行 .startNow() // 立即生效 .startAt(start) // 开始执行时间 .endAt(end) // 结束执行时间 .build(); // 需要注意的时,startNow() 和 startAt() 方法因为修改的时同一个变量 // 所以只有一个会生效,那个在后边那个就被使用
2.1.3 创建JobDetail
1
2
3
4
5JobDetail jobDetail = JobBuilder.newJob(CustomJob.class) // job具体执行类 .withIdentity("jobName", "jobGroupName") // job信息 .setJobData(new JobDataMap(map)) // 任务参数 .build();
2.1.4 配置调度器
1
2
3
4
5
6
7
8
9
10
11
12Scheduler scheduler = new SchedulerFactory().getScheduler(); scheduler.scheduleJob(jobDetail, trigger); // or IOC 注入 @Autowire private Scheduler scheduler; // 启动调度器 scheduler.startUp();
经过以上步骤,一个简单的定时任务就创建完成了。
2.2 Trigger 的使用
触发类型在 withSchedule(ScheduleBuilder<SBT> schedBuilder)
方法中确定,
源码如下
1
2
3
4
5public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder) { this.scheduleBuilder = schedBuilder; return (TriggerBuilder<SBT>) this; }
可以看到,有传递进入的参数决定了触发器的类型。
2.2.1 SimpleTrigger
简单触发器,
借助 SimpleScheduleBuilder 设定,可以设置触发器的执行间隔,以及重复次数
1
2
3
4
5
6
7
8SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger() .withIdentity("tiggerName") // 认证信息 .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInMinutes(10) // 每10分钟执行一次 .repeatForever()) // 无限重复 .startNow() // 立即生效 .build();
2.2.2 CronTrigger
常用的触发器,通过cron表达式设置触发
1
2
3
4
5
6CronTrigger cronTrigger = TriggerBuilder.newTrigger() .withIdentity("cronTrigger") // 认证信息 .withSchedule(CronScheduleBuilder.cronSchedule("0 0/20 10-12 * * ?")) //设置cron // .withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression(""))) .build();
2.2.3 DailyTimeIntervalTrigger
指定每日固定时间段,固定间隔内执行,可指定星期
1
2
3
4
5
6
7
8
9
10
11
12
13DailyTimeIntervalTrigger dailyTimeIntervalTrigger = TriggerBuilder.newTrigger() .withIdentity("dailyTimeIntervalTrigger ") // 认证信息 .withSchedule(DailyTimeIntervalScheduleBuilder .dailyTimeIntervalSchedule() .startingDailyAt(TimeOfDay.hourAndMinuteOfDay(h, m)) // 从h点m分开始 .endingDailyAt(TimeOfDay.hourAndMinuteOfDay(h, m)) // 到h点m分结束 .withIntervalInSeconds(600) // 间隔10分钟执行 .onDaysOfTheWeek(2, 3, 4)) // 每周一 二 三 执行 .build(); // onDaysOfTheWeek() 方法接收可变数组,参数值为 1-7 // 其中1代表周日,2代表周一,以此类推
2.2.4 CalendarIntervalTrigger
与SimpleTrigger 类似,从指定时间开始,已一定的时间间隔执行,可以支持间隔单位为 秒,分,时,天,月,周,年 适用于 每月/每年 等不是固定时间间隔的任务
1
2
3
4
5
6
7CalendarIntervalTrigger calendarIntervalTrigger = TriggerBuilder.newTrigger() .withIdentity("") .withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule() .withIntervalInMonths(3)) // 每三个月执行一次 .startNow() .build();
2.3 带参数的任务执行
传递参数
在创建需要传递参数的任务时,可以通过Trigger 的 usingJobData() 方法传递参数
方法可通过key,value形式传递 usingJobData(key, value)
也可直接接收一个类型为JobDataMap的参数,可通过带参构造方法直接构建
1
2
3JobDataMap jobDataMap = new JobDataMap(Map<k,v> map); TriggerBuilder.newTrigger().usingJobData(jobDataMap).build();
或者是 JobDetail 的setJobDataMap() 和usingJobData() 方法
1
2
3
4
5
6JobDetail jobDetail = JobBuilder.newJob(CustomJob.class) .setJobData(new JobDataMap(map)) .usingJobData("key", "value") .withIdentity(config.getJobName(), config.getJobGroupName()) .build();
解析参数
在任务执行过程中,通过任务上下文解析任务参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import org.quartz.Job; public class CustomJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 从jobDetail 中获取数据 JobDataMap dataMap = context.getJobDetail().getJobDataMap(); // 从trigger中获取数据 // JobDataMap dataMap = context.getTrigger().getJobDataMap(); Object value = dataMap.get("key"); } }
2.4 任务的启动,暂停,修改,移除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22@Autowired private Scheduler scheduler; public void demo() { // 往调度器中添加一个任务 scheduler.scheduleJob(jobDetail, trigger); // 指定触发器 TriggerKey triggerKey = new TriggerKey("tiggerName", "triggerGroupName"); // 暂停触发器 scheduler.pauseTrigger(triggerKey); // 恢复触发器 scheduler.resumeTrigger(triggerKey); // 移除触发器 scheduler.unscheduleJob(triggerKey); // 删除任务 scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName)); }
最后
以上就是殷勤万宝路最近收集整理的关于SpringBoot配置quartz实现定时任务JobDetail Trigger Scheduler JobDataMap 的使用的全部内容,更多相关SpringBoot配置quartz实现定时任务JobDetail内容请搜索靠谱客的其他文章。
发表评论 取消回复