Quartz

什么是Quartz

quartz:石英钟的意思

是一个当今市面上流行的高效的任务调度管理工具

由OpenSymphony开源组织开发

Symphony:交响乐

是java编写的,我们使用费时需要导入依赖即可

为什么需要Quartz

什么是任务调度

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

我们使用过的最简单的调度方法就是Timer

但是Timer的调度功能过于单一,只能是指定时间的延时调用和周期运行

而Quartz可以更详细的指定时间,进行计划调用

Quartz核心组件

调度器:Scheduler

任务:Job

触发器: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 表示最近的工作日(单纯的周一到周五) 如果日字段编写15W表示

    每月15日最近的工作日触发,如果15日是周六就14日触发,如果15日是周日就16日触发

      LW通常一起使用,表示本月的最后一个工作日
  • # 表示第几个,只能使用在周字段上 6#3表示每月的第三个周五

    如果#后面数字写大了,是一个不存在的日期,那就不运行了

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

示例

  • 网络上可用的Cron表达式生成器很多 推荐一个http://cron.ciding.cc/
双11的触发
如果是11月11日0时触发
"0 0 0 11 11 ?" 每个月10日最近的工作日早上9点发工资
0 0 9 10W * ? 0 0 0 5/3 * ?

SpringBoot使用Quartz

SpringBoot框架下使用Quartz格式还是非常固定的

我们选用之前学习微服务的项目csmall减少对大项目的影响

首先添加依赖

我们选项csmall-stock-webapi模块pom文件

<!--  SpringBoot Quartz依赖  -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

先编写要执行的任务

当前项目模块中创建quartz包

包中创建一个QuartzJob的类,实现Job接口

代码如下

public class QuartzJob implements Job {

    @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//输出当前时间
System.out.println("--------------"+ LocalDateTime.now() +"---------------");
}
}

在quartz包下,继续创建一个类QuartzConfig

这个类是一个SpringBoot配置类,它实际上是Quartz调度器的配置

代码的编写基本格式个固定的,同学们需要使用时直接套用这个格式

// 这个配置类就是在配置已经保存在Spring容器中的调度器Scheduler
// 我们需要按下面格式进行配置,才能让Scheduler正常工作
@Configuration
public class QuartzConfig {
// 创建一个JobDetail(工作详情)类对象,保存到Spring容器中,这个类用于封装我们编写的job接口实现类
// @Bean注解标记的方法的返回值会自动保存到Spring容器中(方法名随意)
@Bean
public JobDetail showTime(){
System.out.println("showTime方法运行");
return JobBuilder.newJob(QuartzJob.class) // 绑定要运行的任务类的反射
.withIdentity("date") // 设置这个job的名称
.storeDurably() //
.build();
} // 下面要声明触发器,Trigger,触发器决定我们的工作\任务何时触发
@Bean
public Trigger showTimeTrigger(){
System.out.println("showTime触发器运行");
// 定义Cron表达式 每分钟触发一次的定义
CronScheduleBuilder cronScheduleBuilder=
CronScheduleBuilder.cronSchedule("0 0/1 * * * ?");
return TriggerBuilder.newTrigger()
.forJob(showTime()) // 绑定JobDetail JobDetail对象已经在Spring容器中
.withIdentity("dateTrigger") // 定义触发器名称
.withSchedule(cronScheduleBuilder) // 绑定Cron表达式
.build();
} }

Nacos\Seata需要启动

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

然后启动csmall-stock模块

观察控制台输出

课上作业

利用Quart实现

每隔2分钟运行一次添加库存的操作,PC100号商品的库存添加10

创建StockJob类代码如下

// 从Spring容器中获得业务逻辑层对象,然后PC100商品新增库存数10
public class StockJob implements Job { @Autowired
private IStockService stockService; @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
StockReduceCountDTO stockReduceCountDTO=new StockReduceCountDTO();
stockReduceCountDTO.setCommodityCode("PC100");
// 业务本身是减少库存,我们赋值减少库存数为-10,就是增加库存数10
stockReduceCountDTO.setReduceCount(-10);
stockService.reduceCommodityCount(stockReduceCountDTO);
}
}

可以继续在QuartzConfig类中配置JobDetail和Trigger

@Bean
public JobDetail addStock(){
return JobBuilder.newJob(StockJob.class)
.withIdentity("addStock")
.storeDurably()
.build();
}
@Bean
public Trigger addStockTrigger(){
CronScheduleBuilder cronScheduleBuilder=
CronScheduleBuilder.cronSchedule("0 0/2 * * * ?");
return TriggerBuilder.newTrigger()
.forJob(addStock())
.withIdentity("addStockTrigger")
.withSchedule(cronScheduleBuilder)
.build();
}

7.4 国际时区校正

//如果是国际时间判断,需要添加时区修正来判断时间
//判断结束时间大于起始时间,否则发生异常
if (endTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() <
startTime.toInstant(ZoneOffset.of("+8")).toEpochMilli()) {
throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,"结束时间应该大于起始时间");
}

5-10 Quartz 任务调度的更多相关文章

  1. Quartz任务调度快速入门

    Quartz任务调度快速入门 概述 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的 ...

  2. Quartz任务调度入门

    Quartz任务调度入门 了解Quartz体系结构Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念 ...

  3. Spring研磨分析、Quartz任务调度、Hibernate深入浅出系列文章笔记汇总

    Spring研磨分析.Quartz任务调度.Hibernate深入浅出系列文章笔记汇总 置顶2017年04月27日 10:46:45 阅读数:1213 这系列文章主要是对Spring.Quartz.H ...

  4. Quartz任务调度2

    注意: 不同的版本的jar包,具体的操作不太相同,但是思路是相同的:比如1.8.6jar包中,JobDetail是个类,直接通过构造方法与Job类关联.SimpleTrigger和CornTrigge ...

  5. (转)Quartz任务调度(1)概念例析快速入门

    http://blog.csdn.net/qwe6112071/article/details/50991563 Quartz框架需求引入 在现实开发中,我们常常会遇到需要系统在特定时刻完成特定任务的 ...

  6. .net core中使用Quartz任务调度

    使用xml配置Quartz任务调度程序 1.Nuget Install-Package Quartz Install-Package Quartz.Plugins 2.站点根目录下加入文件quartz ...

  7. Quartz任务调度:MisFire策略和源码分析

    Quartz是为大家熟知的任务调度框架,先看看官网的介绍: ---------------------------------------------------------------------- ...

  8. 从零开始学 Java - Spring 使用 Quartz 任务调度定时器

    生活的味道 睁开眼看一看窗外的阳光,伸一个懒腰,拿起放在床一旁的水白开水,甜甜的味道,晃着尾巴东张西望的猫猫,在窗台上舞蹈.你向生活微笑,生活也向你微笑. 请你不要询问我的未来,这有些可笑.你问我你是 ...

  9. Quartz任务调度

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Quartz任务调度 课程目标 : 了解Quartz框架 : 任务(Job)  触发器(Trig ...

  10. Quartz任务调度实践

    最近在写一个任务调度程序,需要每隔几秒查询数据库,并取出数据做一些处理操作.使用到了Quartz任务调度框架. 基本概念 Quartz包含几个重要的对象,分别为任务(Job),触发器(Trigger) ...

随机推荐

  1. [AcWing 29] 删除链表中重复的节点

    点击查看代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * L ...

  2. 初探webpack之编写loader

    初探webpack之编写loader loader加载器是webpack的核心之一,其用于将不同类型的文件转换为webpack可识别的模块,即用于把模块原内容按照需求转换成新内容,用以加载非js模块, ...

  3. Web3.0应用程序架构

    Web 3.0 应用程序(或"DApps")的架构与 Web 2.0 应用程序完全不同. 以博客园为例,这是一个简洁的博客网站,用户可以发布自己的内容并可以评论他人的内容进行互动. ...

  4. 小米 pro 笔记本双硬盘设置引导盘

    功能键 F2 进入 BIOS F12 进入 Boot 选项 步骤 小米 Pro 默认是开启了 UEFI,如果 Boot 选项没有显示出期望的系统盘,那么就是这个系统盘没有 UEFI 分区,按照这个文档 ...

  5. 89. Gray Code - LeetCode

    Question 89. Gray Code Solution 思路: n = 0 0 n = 1 0 1 n = 2 00 01 10 11 n = 3 000 001 010 011 100 10 ...

  6. SylixOS——虚拟机网络配置

    网络配置 点击设置按钮 新建虚拟网络适配器 输入IP地址(注意:IP地址必须和SylixOS在同一个子网内) 点击确定等待,虚拟网络适配器建立完成后效果如下(多了一个名为"以太网2" ...

  7. 羽夏笔记—— AT&T 与 GCC

    写在前面   本文是本人根据<AT&T 汇编语言与 GCC 内嵌汇编简介>进一步整理,修改了一些错误,并删除我并不能复现代码相关的部分.该文章一是我对 AT&T 的学习记录 ...

  8. Vue2-组件通讯传值

    Vue2组件通讯传值 方法 Slot插槽--父向子内容分发,子组件只读 mixin混入--定义公共变量或方法,mixin数据不共享,组件中mixin实例互不影响 provide+inject--依赖注 ...

  9. 纯CSS如何禁止用户复制网页的内容?

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  10. 前端2CSS

    内容概要 form表单 网络请求方式 CSS简介 CSS查找标签之基本选择器(重要) CSS查找标签之组合选择器(重要) 属性选择器 分组与嵌套 伪类选择器 内容详情 form表单 "&qu ...