Quartz

是java编写的,使用时直接导入依赖即可

为什么需要Quartz

什么是任务调度(计划任务)

所谓任务调度,就是执行某些具体动作的时间计划,也是计划任务

Quartz的调度功能更详细的指定时间,比Timer功能多

Quartz核心组件

image
Scheduler:调度器

Job:任务

Trigger:触发器

调度器来配置,计划什么时间触发什么任务,简单来说就是调度器规定什么时间做什么事情

  • job(工作\任务):Quartz实现过程中提供一个接口,接口中有一个方法execute( )。
1
2
3
4
5
​       在这个方法中编写要进行的操作(具体要执行的任务)

​ 我们还需要一个JobDetail的类型的对象,Quartz每次执行job时,会实例化Job对象,去调用execute( )

JobDetail是用来描述Job实现类的静态信息
  • Trigger(触发器):能够描述触发指定的Job规则,分为简单触发和复杂触发
1
2
3
​        简单触发可以使用SimpleTrigger实现类,功能类似timer

​ 复杂触发可以使用CronTrigger实现类,内部使用Cron表达式描述各种复杂的时间调度计划
  • Scheduler(调度器):一个可以规定哪个触发器绑定哪个job的容器
1
​        在调度器中保存全部的Quartz保存的任务

SpringBoot框架中,添加Quartz依赖后,调度器由SpringBoot管理,我们不需要编写

Cron表达式

格式:[秒] [分] [时] [日] [月] [周] [年]

序号 说明 是否必填 允许填写的值 允许的通配符
1 0-59 , - * /
2 0-59 , - * /
3 0-23 , - * /
4 1-31 , - * ? / L W
5 1-12 or JAN-DEC , - * /
6 1-7 or SUN-SAT , - * ? / L #
7 empty 或1970-2099 , - * /
  • *表示任何值,如果在时的位置上编写,表示每小时都会触发

  • ,表示分隔符,如果在分的位置上写成20,40 ,表示在20分钟和40分钟都会触发,触发两次

  • -表示一个区间,在秒位置上写5-10,表示在5,6,7,8,9,10都会触发

  • /表示递增触发,在秒位置上写5/10,表示5秒开始每隔10秒触发一次

  • ?表示不确定值,因为我们在定日期时,一般确定日期就不确定是周几,相反确定是周几就不确定日期

  • L表示Last最后的意思,我们设置当月的最后一天,就在日字段上用L表示

    周字段使用L,表示最后一周,一般会和1-7的数组组合

    比如:6L表示本月最后一周的周五

  • W是work表示最近的工作日(单纯的周一到周五),如果日字段写10W表示每个月的10日最近的工作日触发,如果10日是周六,则9日就触发,如果10日是周日,则11号触发

    LW通常一起使用,表示本月的最后一个工作日

  • #表示第几个,只能使用在周字段上6#3,表示每月的第三个周五,如果#后数字写大了,是一个不存在的日期,那就不运行了

    适合设计在母亲节或父亲节这样的日期运行

比如现在2.14日情人节在0时触发活动任务:“0 0 0 14 2 ?”

网络上可用的Cron表达式生成器有很多,推荐一个:http://cron.ciding.cc/

双十一的0时触发,表达式:0 0 0 11 11 ?

SpringBoot使用Quartz

csmall-stock-webapi测试Quartz

1
2
3
4
5
<!--引入Quartz依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

创建Job的实现类

1
2
3
4
5
6
7
public class QuartzJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//具体要执行的任务--输出当前时间
System.out.println("=============="+LocalDateTime.now()+"==============");
}
}

创建配置类

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
//当前类是配置Spring容器中的调度器Scheduler
@Configuration
public class QuartzConfig {
//创建一个JobDetail对象封装Job的实现类,需要交给Spring容器管理
@Bean
public JobDetail showTime(){
System.out.println("showTime方法运行");
return JobBuilder.newJob(QuartzJob.class)
//给这个JobDetail起个名字
.withIdentity("datetime")
//即使没有触发器绑定这个JobDetail,也不会删除
.storeDurably()
.build();
}
//创建触发器对象,可以设置job什么时候运行,也需要保存到Spring容器
@Bean
public Trigger showTimeTrigger(){
System.out.println("showTimeTrigger方法运行");
//cron表达式
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("5,10 * 20 13 2 ?");
return TriggerBuilder.newTrigger()
//绑定要运行的JobDetail对象
.forJob(showTime())
//当前触发器的名称
.withIdentity("dateTrigger")
//绑定cron表达式
.withSchedule(cronScheduleBuilder)
.build();
}
}

测试

Nacos\Seata需要启动

其他服务和软件都可以关闭

然后启动csmall-stock模块

观察控制台输出
企业微信截图_16762900206422