定时任务--Quartz
Quartz基本介绍
官网:http://www.quartz-scheduler.org/
在SpringBoot中是直接内置Quartz框架的
Quartz是OpenSymphony开源的一个项目,是一个由Java编写的开源作业调度框架。
简单的任务使用:
运行类:需要添加注解@EnableScheduling
@SpringBootApplication @EnableScheduling //告诉Spring创建一个task executor,如果我们没有这个标注,所有@Scheduled标注都不会执行 public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
任务(定时任务)
@Component public class ScheduledTask { @Scheduled(fixedRate = 5000) //表示每隔5000ms,Spring scheduling会调用一次该方法,不论该方法的执行时间是多少 public void reportCurrentTime() throws InterruptedException { System.out.println(new Date())); } @Scheduled(fixedDelay = 5000) //表示当方法执行完毕5000ms后,Spring scheduling会再次调用该方法 public void reportCurrentTimeAfterSleep() throws InterruptedException { System.out.println(new Date())); } @Scheduled(cron = "0 0 1 * * *") //提供了一种通用的定时任务表达式,这里表示每隔5秒执行一次,更加详细的信息可以参考cron表达式。 public void reportCurrentTimeCron() throws InterruptedException { System.out.println(new Date())); } }
Cron表达式:
定时任务离不开Cron表达式设置具体执行时间或执行周期,Cron表达式是一个字符串,一般有两种表达:
秒 分 小时 日 月 星期 年
秒 分 小时 日 月 星期
其中,年份即为可选的,所以一般表达式为6-7个域,每个域以空格分开。其中的星期除了可以使用英文缩写,也可以用数字
1-7数字
来表示,注意1
表示的是星期日
,7
表示的星期六
。
*
:星号,表示每个字段对应的时间域的每一个
,如在日中,就是表示每天。
?
:问号,只能在日期和星期字段中使用,表示无意义的值
,等价于点位符。
-
:减号,表示一个范围,如在分钟中使用5-8
,则表示5-8分钟
,即5、6、7、8分钟。
,
:逗号,表示一个列表值,如在星期中星期一和星期三使用MON,WED
,也可以使用数字来表示:1,3
。
/
:斜杠,使用x/y
来表示一个等步长序列,x表示起始值,y表示步长值。如在秒字段中使用0/15
,表示从0秒开始,每15秒增量,即0秒,15秒,30秒,45秒,这种就可以理解为每15秒
执行任务。
L
:只能在日期和星期字段中使用,表示Last
。在日期中,L
表示月份的最后一天,如1月中的31日;在星期中,L
表示星期六(或数字7)。
W
:只能在日期字段中使用,表示离该日期最近的工作期,不可以跨月。如10W
,表示离该月10号最近的工作日,若10号为星期六,则匹配9号星期五;若10号为星期日,则匹配11号星期一;若10号为星期一,则匹配10号星期一。LW
组合表示该月的最后一个工作日。
C
:只能在日期和星期字段中使用,表示Calendar
,即计划所关联的日期,若日期未被关联,则等价于关联所有日期。如日期中使用4C
,表示日期4号以后的第一天;星期中使用1C
,表示星期日后的第一天。
#
:井号只能在星期字段中使用,表示当月某个工作日。如6#2
表示当月的第二个星期五(其中,6
表示星期五,#3
表示当月的第二个).
Cron表达式 说明 0 0 * * * ? 每小时0分0秒运行 0 0 1 * * ? 每天01:00:00运行运行 0 0 1 * * ? * 每天01:00:00运行运行,同上 0 0 1 * * ? 2021 2021年每天01:00:00运行 0 * 10 * * ? 每天10点-11点之间每分钟运行一次,开始于10:00:00,结束于10:59:00 0 0/5 10 * * ? 每天10点-11点之间每5分钟运行一次,开始于10:00:00,结束于10:59:00 0 0/5 10,15 * * ? 每天10点-11点之间每5分钟运行一次,每天15点-16点之间每5分钟运行一次 0 0-10 10 * * ? 每天10:00-10:10之间每分钟运行 0 10 1 ? * MON-FRI 每周一,二,三,四,五的1:10分运行 0 10 1 1 * ? 每月1日的1:10分运行 0 10 1 L * ? 每月最后一天1:10分运行 0 10 1 ? * 6L 每月最后一个星期五1:10分运行 0 10 1 ? * 6#3 每月第3个星期五1:10分运行
-
Quartz的组成:
- 任务:JobDetail
- 触发器:Trigger(分为SimpleTrigger和CronTrigger)
- 调度器:Scheduler
1.1 任务:JobDetail
JobDetail主要由JobKey(job的名字name和分组group)、JobClass、JobDataMap(任务相关的数据)、JobBuilder组成。常用的是前几个。
示例:
Map<String,String> jobData = new HashMap<>(); String jobName = "schedulerJob"; String jobGroup = "schedulerGroup"; jobData.put("key00", "value00"); JobDetail jobDetail = JobBuilder.newJob(SchedulerJob.class) .withIdentity(jobName, jobGroup) .usingJobData("key01", "value01") .usingJobData(jobData) .storeDurably() .build();
1.2 触发器:Trigger
Trigger规定触发执行Job实现类,主要有SimpleTrigger和CronTrigger两个实现类。Trigger由以下部分组成:
- TriggerKey(job的名字name和分组group)
- JobDataMap(Trigger相关的数据,同JobDetail中JobDataMap,存相同key,若value不同,会覆盖前者。)
- ScheduleBuilder(有CronScheduleBuilder、SimpleScheduleBuilder、CalendarIntervalScheduleBuilder、DailyTimeIntervalScheduleBuilder常用前2种。)
1.3 任务调度器 Scheduler
标签:表示,10,00,Quartz,--,日期,定时,运行 From: https://www.cnblogs.com/xuzhidong/p/16818859.html调度器就是为了读取触发器Trigger从而触发定时任务JobDetail。可以通过SchedulerFactory进行创建调度器,分为
StdSchedulerFactory(常用)和DirectSchedulerFactory
两种。
- StdSchedulerFactory使用一组属性(放在配置文件中)创建和初始化调度器,然后通过
getScheduler()
方法生成调度程序。- DirectSchedulerFactory不常用,容易硬编码。