什么是Quartz
什么是Quartz
quartz:石英钟的意思
是一个当今市面上流行的高效的任务调用管理工具
由OpenSymphony开源组织开发
Symphony:交响乐
是java编写的,我们使用时需要导入依赖即可
为什么需要Quartz
什么是任务调度
所谓任务调用,就是执行某些具体动作的时间计划
我们使用过的最简单的调度方法就是Timer
Timer的调度功能过于单一,只能是指定时间的延时调用和周期运行
而Quartz可以更详细的指定时间,进行计划调用
Quartz核心组件
调度器:Scheduler
任务:job
触发器:Trigger
触发器:Trigger
调度器来配置计划什么时间触发什么任务
简单来说就是调度器规定什么时间做什么事情
- job(工作任务):Quartz 实现过程中是一个接口,接口中有一个方法execute(执行的意思)
我们创建一个类,实现这个接口,在方法中编写要进行的操作(执行具体任务)
我们还需要一个JobDetail的类型的对象,Quartz每次执行job时
会实例化job类型对象,去调用这个方法,JobDetail是用来描述Job实现类
的静态信息, 比如任务运行时在Quartz中的名称
- Trigger(触发器):能够描述触发指定job的规则,分为简单触发和复杂触发
简单触发可以使用SimplTrigger实现类.功能类似timer
复杂触发可以使用CronTrigger实现类,内部利用cron表达式描述各种复杂的时间调度计划
- Scheduler(调度器):一个可以规定哪个触发器绑定哪个job的容器
在调度器中保存全部的Quartz 保存的任务
SpringBoot框架下,添加Quartz依赖后,调度器由SpringBoot管理,我们不需要编写
Cron表达式
- 表示任何值,如果在分的字段上编写,表示每分钟都会触发
- , 是个分割符如果秒字段我想20秒和40秒时触发两次就写 20,40
- - 表示一个区间 秒字段5-10 表示 5,6,7,8,9,10
- / 表示递增触发 秒字段 5/10表示5秒开始每隔10秒触发一次
日字段编写1/3表示从每月1日起每隔3天触发一次
- ? 表示不确定值, 因为我们在定日期时,一般确定日期就不确定是周几,相反确定周几时就不确定日期
- L 表示last的意思,我们可以设置当月的一天,就会在日字段用L表示,
周字段使用L表示一周,一般会和1-7的数字组合
例如6L表示本月一周的周五
- W (ork)表示最近的工作日(单纯的周一到周五) 如果日字段编写15W表示
每月15日最近的工作日触发,如果15日是周六就14日触发,如果15日是周日就16日触发
LW通常一起使用,表示本月的一个工作日
- # 表示第几个,只能使用在周字段上 6#3表示每月的第三个周五
如果#后面数字写大了,是一个不存在的日期,那就不运行了
适合设计在母亲节或父亲节这样的日期运行
网络上可用的Cron表达式生成器很多
推荐一个http://cron.ciding./
双11的0时触发
"0 0 0 11 11 ?"
每个月10日最近的工作日早上9点发工资
"0 0 9 10W ?"
SpringBoot使用Quartz
SpringBoot框架下使用Quartz格式还是非常固定的
我们选用之前学习微服务的项目csmall减少对大项目的影响
添加依赖
我们选项csmall-stock-ebapi模块pom文件
```xml
.springframeork.boot
spring-boot-starter-quartz
```
```xml``` .springframeork.boot spring-boot-starter-quartz
先编写要执行的任务
当前项目模块中创建quartz包
包中创建一个QuartzJob的类,实现Job接口
包中创建一个QuartzJob的类,实现Job接口
代码如下
```java public class QuartzJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) thros JobExecutionException { // 输出当前时间 System.out.println("--------------"+ LocalDateTime.no()+"---------------"); } } ```
上面编写的是Job接口的实现类,要想运行还需要将它封装为JobDetail对象保存在Spring容器中
还有要创建一个Trigger设置要运行的时机,也保存到Spring容器中
在quartz包下,再创建一个QuartzConfig类,其中编写它们的调度绑定关系
这个格式是固定的,后面再需要绑定,直接套用即可
```java
// 当前类是在配置Spring容器中的调度器Scheduler
// 所有配置Spring内容的配置类,必须添加@Configuration注解
@Configuration
public class QuartzConfig {
// 创建一个JobDetail(工作详情)对象,并将它保存到Spring容器中
// 这个对象中要包含要运行的Job接口实现类的反射
// @Bean注解会将其后的方法的返回值保存到Spring容器中
@Bean
public JobDetail shoTime(){
System.out.println("shoTime方法运行");
return JobBuilder.neJob(QuartzJob.class)
// 给这个JobDetail定个名字
.ithIdentity("datetime")
// 即使没有触发器绑定当前JobDetail也不会将它删除
.storeDurably()
.build();
}
```java // 当前类是在配置Spring容器中的调度器Scheduler // 所有配置Spring内容的配置类,必须添加@Configuration注解 @Configuration public class QuartzConfig { // 创建一个JobDetail(工作详情)对象,并将它保存到Spring容器中 // 这个对象中要包含要运行的Job接口实现类的反射 // @Bean注解会将其后的方法的返回值保存到Spring容器中 @Bean public JobDetail shoTime(){ System.out.println("shoTime方法运行"); return JobBuilder.neJob(QuartzJob.class) // 给这个JobDetail定个名字 .ithIdentity("datetime") // 即使没有触发器绑定当前JobDetail也不会将它删除 .storeDurably() .build(); }
// 下面要声明触发器对象,它设置job何时运行,也是保存到Spring容器中
@Bean
public Trigger shoTimeTrigger(){
System.out.println("shoTimeTrigger方法运行");
// 定义Cron表达式
CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule("0 57 17 5 8 ?");
return TriggerBuilder.neTrigger()
// 绑定要运行的jobDetail对象
.forJob(shoTime())
// 绑定当前触发器名称
.ithIdentity("dateTrigger")
// 绑定cron表达式
.ithSchedule(cronScheduleBuilder)
.build();
}
}
空调维修
- 海信电视维修站 海信电视维修站点
- 格兰仕空调售后电话 格兰仕空调维修售后服务电
- 家电售后服务 家电售后服务流程
- 华扬太阳能维修 华扬太阳能维修收费标准表
- 三菱电机空调维修 三菱电机空调维修费用高吗
- 美的燃气灶维修 美的燃气灶维修收费标准明细
- 科龙空调售后服务 科龙空调售后服务网点
- 华帝热水器维修 华帝热水器维修常见故障
- 康泉热水器维修 康泉热水器维修故障
- 华凌冰箱维修电话 华凌冰箱维修点电话
- 海尔维修站 海尔维修站点地址在哪里
- 北京海信空调维修 北京海信空调售后服务
- 科龙空调维修 科龙空调维修故障
- 皇明太阳能售后 皇明太阳能售后维修点
- 海信冰箱售后服务 海信冰箱售后服务热线电话
- 海尔热水器服务热线