Quartz
什么是quartz
是一个完全由java编写的开源作业调度框架,为在java应用程序中进行作业调度提供了简单却强大的机制
作用
在某一个有规律的时间点干某件事情
quartz就是来干这样的事情的,你给他一个触发条件定义,它负责到了时间点,触发相应的job起来干活,并且时间的触发条件可以非常复杂,复杂到需要一个专门的框架来实现
核心概念
job
任务,具体要执行的任务逻辑(内容)
jobdetail
任务详情:定义一个可执行的调度程序,job是这个可执行程序调度程序所要执行的内容
Tirgger
任务触发器:定义任务执行的方式。间隔
scheduler
任务调度器:控制所有的任务调度(Tirgger与JobDetail组合)
两个组件
JobStore
存储运行时信息的
ThreadPool
线程池
Trigger四种实现方式
SimpleTrigger
指定从某一个时间开始,以一点的时间间隔执行的任务
属性
repeatinterval 重复间隔
repeatCount 重复次数
CalendarIntervalTrigger
类似SimpleTrigger,指定从某一个小时开始,以一定的时间间隔执行的任务,支持单位有,秒、分钟、小时、天、月、年、星期。
属性
interval:执行间隔
inervalUnit:执行间隔的单位
优势
更方便
支持不是固定长度的间隔
劣势
精度只能到秒
DailyTimeIntervalTrigger
指定每天的某个时间段内,以一定的时间间隔执行任务,并且它可以支持指定星期,它适合的任务类似于:每天的9-18:00,每隔70秒执行一次,并且只要是周一到周五执行
属性
startTimeOfDay 每天开始时间
endTimeofday 每天结束时间
interval 时间间隔
intervalUnit 执行间隔单位
repeatcount 重复次数
CronTrigger
适合于更复杂的任务,它支持类型于Linux Cron语法 ,基本上它覆盖了以上的三个Triggerd 绝大部分能力但不是全部,当然,也更难理解和掌握,它适合的任务类似每天0:00,9:00,18:00各执行一次
属性
Cron表达式
表达式参数
Quartz扩展
集群
Jobstore
RMI
监听器
插件
那么开始动手使用吧!
先导入依赖:
<-- quartz依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
其实使用非常的简单,先创建一个Job类我们让他来工作:
package com.amt.job;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.amt.dao.OutpatientReservationNumberMapper;
import lombok.extern.slf4j.Slf4j;
/**
* @Title: JonTwo.java
* @Package com.amt.job
* @Description: TODO(测试Job)
* @author lys
* @date 2019年7月22日 下午6:28:43
* Copyright (c) ©1994-2019 Scjydz.com All Rights Reserved.
*/
//这个注解必须加上,把它交给容器管理
@Component
@Slf4j
public class TestJob {
//这里可以注入你的持久层接口
//@Autowired
//private OutpatientReservationNumberMapper numberMapper;
//调度任务执行
@Scheduled(cron = "0 0 1 * * ? ") // 每天晚上点1点00开始执行每天执行一次
public void execute() {
log.info("每天晚上1点执行》》》》》》》》》》");
//这里写你自己的业务逻辑
//numberMapper.deleteAllDoctor();
log.info("任务已执行完》》》》》》》》》》");
}
}
这里是使用的Cron表达式调度任务,现在这种方式非常方便且又灵活,这里补充一张图来说明:
附上生成表达式的地址:http://cron.qqe2.com/
这样我们的任务就已经创建完成了,别忘了在我们的Job类上加上@Component注解哟!不然任务是不生效的。
然后我们还得在Boot启动类上加上:@EnableScheduling
package com.amt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;
import lombok.extern.slf4j.Slf4j;
/**
* @Title: AppOutpatientApplication.java
* @Package com.amt
* @Description: TODO(启动类)
* @author lys
* @date 2019年7月11日 上午10:52:49
* Copyright (c) ©1994-2019 Scjydz.com All Rights Reserved.
*/
@SpringBootApplication
@EnableScheduling
@Slf4j
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
log.info("服务启动完成。");
}
}
这样我们的调度任务就完成了!非常的简单实用。