Spring Boot集成Quartz动态实现数据库任务
1. Quartz简介
1.1. 什么是Quartz
Quartz是一个开源的任务调度框架。作用是基于定时、定期的策略来执行任务。
它是OpenSymphony开源组织在Job scheduling领域又一个开源项目。
“任务进度管理器”就是一个在预先被纳入日程,当时间到达时,负责执行(或者通知)其他软件组件的系统。
简单来说就是实现“计划(或定时)任务”的系统,例如:订单下单后未付款,15分钟后自动撤消订单,并自动解锁锁定的商品。
官网:http://www.quartz-scheduler.org
参考:https://github.com/dufyun/quartz-core-learning
1.2. Quartz可以用来做什么?
Quartz是一个任务调度框架。比如你遇到这样的问题:
- 想每月11号自动提示信用卡还款金额;每月28号,信用卡自动还款。
- 订单下单后未付款,15分钟后自动撤消订单,并自动解锁锁定的商品。
- 想每年4月1日自己给当年暗恋女神发一封匿名贺卡。
- 想每隔1小时,备份一下自己的爱情动作片、学习笔记到云盘。
- 医院系统11点才能开放挂号。
- 企业中如每天凌晨2点触发数据同步、发送Email等操作。
- ……
这些问题总结起来就是:在某一个有规律的时间点干某件事。
并且时间的触发的条件可以非常复杂(比如每月最后一个工作日的17:50),复杂到需要一个专门的框架来干这个事。Quartz就是来干这样的事,你给它一个触发条件的定义
,它负责到了时间点
,触发相应的Job
起来干活。
1.3. 同类型框架有哪些?
- TimeTask: 在Quartz前还是显得过于简单、不完善,不能直接满足开发者的较为复杂的应用场景。
- Elastic-Job: 当当网推出的分布式定时任务框架。
- TBSchedule: Alibaba开发的分布式定时任务框架。
2. Spring Boot集成Quartz动态实现数据库任务
2.1. 搭建Spring Boot工程
2.2. 引入Quartz依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.3. 添加注解
在主程序类上加@EnableScheduling
开启定时任务注解。
@SpringBootApplication
@MapperScan("com.example.mapper")
@EnableSwagger2
@EnableScheduling
public class SPApplication {public static void main(String[] args) {SpringApplication.run(SPApplication.class, args);}
}
2.4. 添加Quartz配置文件
在application.yml的spring下添加:
quartz:#相关属性配置properties:org:quartz:scheduler:instanceName: DefaultQuartzSchedulerinstanceId: AUTOjobStore:class: org.quartz.impl.jdbcjobstore.JobStoreTXdriverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegatetablePrefix: QRTZ_isClustered: falseclusterCheckinInterval: 10000useProperties: truethreadPool:class: org.quartz.simpl.SimpleThreadPoolthreadCount: 10threadPriority: 5threadsInheritContextClassLoaderOfInitializingThread: true#数据库方式job-store-type: jdbc#当spring关闭时,会等待所有已经启动的quartz job结束后spring才能完全shutdownwait-for-jobs-to-complete-on-shutdown: true
2.5. 创建job类
任务一:
public class QMJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("任务一....");}
}
任务二:
public class YRJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("任务二....");}
}
2.6. 创建Quartz需要的数据库表
项目中Quartz的数据库表由两部分组成:
第一部分:Quartz自带的11张表。
第二部分:项目中需要的任务记录表、任务参数表。
2.6.1. 创建Quartz自带的11张表
第一步:进入Quartz的官网: http://www.quartz-scheduler.org/,点击“Downloads”。
在“Downloads”页面下载相应的压缩包文件。
第二步:对下载的压缩包文件进行解压。
第三步:执行SQL脚本
在解压目录\src\org\quartz\impl\jdbcjobstore
下有常用数据库创建Quartz表的脚本:
根据项目使用的数据库软件,选择相应的.sql脚本执行。比如:MySQL数据库就使用tables_mysql.sql
。
将tables_mysql.sql导入运行,在数据库中生成11张表,如下:
2.6.2. 创建项目中需要的任务记录表、任务参数表
需要两张业务表:
Id
Job_name
Job_group
Job_class
Job_descript
Job_cron
Job_status
Add_time
Update_time
爬取表:
Id
Job_id
Request_time
Job_data
第一步:创建任务记录表,并添加两条测试数据
Class c = Class.forName(“com.manubao.quartz.MyJob”)
任务记录表t_schedule_trigger:
#创建任务记录表
CREATE TABLE `t_schedule_trigger`(`id` INT PRIMARY KEY AUTO_INCREMENT, #主键,标识列`job_name` VARCHAR(100) NOT NULL UNIQUE, #任务名称`job_group` VARCHAR(50) NOT NULL, #任务分组名称`job_class` VARCHAR(200) NOT NULL, #任务类:填写Job类的完整类名`job_desc` VARCHAR(200) NOT NULL, #任务描述`cron` VARCHAR(100) NOT NULL, #Cron表达式`trigger_name` VARCHAR(100) NOT NULL UNIQUE , #触发器名称`trigger_group` VARCHAR(50) NOT NULL, #触发器分组名称`trigger_desc` VARCHAR(200) NOT NULL, #触发器描述`status` CHAR(1) NOT NULL, #状态:0禁用 1启用`account` INT NOT NULL, #添加人:这里需要与用户表建立主外键关系`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP #添加时间
)ENGINE=INNODB DEFAULT CHARSET=utf8;#添加数据
insert into t_schedule_trigger(
job_name, job_group, job_class, job_desc, cron, trigger_name, trigger_group, trigger_desc, status, account
) values
('愚人节的问候', '愚人组' , 'com.manubao.quartz.YRJob', '愚人节发个ILOVEYOU', '*/5 * * * * *', '愚人节触发器', 'trigger1', '触发器描述', 1, 1),
('中秋节的问候', '中秋组' , 'com.manubao.quartz.QmJob', '中秋节发个IMISSYOU', '*/7 * * * * *', '中秋节触发器', 'trigger1', '中秋节描述', 1, 1);
第二步:创建任务中的参数表(暂时不用)
#创建任务参数表
create table `t_schedule_trigger_param`(`id` int primary key auto_increment, # ID`name` varchar(200) not null, #参数名`value` varchar(512), #参数值`st_id` int not null references t_schedule_trigger(id) #外键:引用t_schedule_trigger(id)
);
2.7. 创建任务记录表实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_schedule_trigger")
public class Trigger {@TableId(value = "id", type = IdType.AUTO)private Integer id; //主键,标识列private String jobName; //任务名称private String jobGroup; //任务分组名称private String jobClass; //任务类:填写Job类的完整类名private String jobDesc; //任务描述private String cron; //Cron表达式private String triggerName; //触发器名称private String triggerGroup; //触发器分组名称private String triggerDesc; //触发器描述private int status; //状态:0禁用 1启用private int account; //添加人private Date createTime; //添加时间
}
2.8. Dao层接口
@Mapper
public interface QuartzMapper extends BaseMapper<Trigger> {}
2.9. Service层接口及实现类
接口:
public interface QuartzService extends IService<Trigger> {//更新任务void refreshTrigger();
}
实现类:
import javax.annotation.Resource;
import java.util.List;@Service
public class QuartzServiceImpl extends ServiceImpl<QuartzMapper, Trigger> implements QuartzService {@Resourceprivate QuartzMapper quartzMapper;@Autowiredprivate Scheduler scheduler;@Overridepublic void refreshTrigger() {//获得所有的任务List<Trigger> triggers = quartzMapper.selectList(null);if( triggers != null){ //数据库中存在任务for (Trigger trigger1 : triggers) {//System.out.println(trigger);if(trigger1.getStatus() == 1) { //1表示正常启用//拿出一个任务,启动一个任务try {//1.定义JobDetail,将HelloJob类添加到JobDetail对象中(添加到Job清单)//com.example.job.YRJobJobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) Class.forName(trigger1.getJobClass()))//任务的名字和组的名字(坑)//任务名字不能相同.withIdentity(trigger1.getJobName(), trigger1.getJobGroup()).build();//2.定义Trigger触发器,使用简单触发器,设置name/grouporg.quartz.Trigger trigger = TriggerBuilder.newTrigger().withIdentity(trigger1.getTriggerName(), trigger1.getTriggerGroup()).startNow().withSchedule(CronScheduleBuilder.cronSchedule(trigger1.getCron())).build();//3.创建scheduler调度器scheduler.scheduleJob(jobDetail, trigger);//启动调度器scheduler.start();} catch (Exception e) {e.printStackTrace();}}}}}
}
Spring Boot集成Quartz动态实现数据库任务相关推荐
- Spring boot2集成quartz动态任务管理+Web UI
Dynamic Quartz 最近在公司实习,发现公司有一套spring+Quartz的动态任务管理系统.可以使用Web界面进行任务动态的创建.删除.停止.运行和修改.刚好最近在学习spring ...
- Spring Boot集成Quartz注入Spring管理的类
摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入. Spring有自己的Schedule定时任务,在S ...
- mysql的每隔1分钟定时_简单易用,spring boot集成quartz,实现分布式定时任务
什么是quartz? Quartz是一个完全由 Java 编写的开源任务调度框架. 我们经常会遇到一些问题: 想每个月27号,提醒信用卡还款: 想每隔1小时,提醒一下,累了,站起来活动一下: 想每个月 ...
- Spring Boot 集成Quartz
1:在项目的pom文件添加quartz依赖 <!-- quartz定时任务 --> <dependency><groupId>org.springframework ...
- spring boot 集成mybatis连接oracle数据库
1. POM文件添加依赖 <!-- Mybatis --><dependency><groupId>org.mybatis.spring.boot</grou ...
- spring boot集成Quartz实现定时任务
简介 Quartz是一款功能强大的任务调度器,Quartz有两个比较核心的组件:Job 和 Trigger. Quartz的三个基本要素 Scheduler:调度器,所有的调度都是由它来控制. Tri ...
- Spring Boot 集成 Quartz
1.美图 2.概述 在项⽬开发中,经常需要定时任务来帮助我们来做一些内容,⽐如定时派息.跑批对账.业务监控等.Spring Boot 体系中现在有两种⽅案可以选择,第⼀种是 Spring Boot 内 ...
- spring boot集成quartz scheduler
工具.版本 开发工具:IntelliJ IDEA JDK:1.8 spring-boot:2.5.6(事例使用,可根据自己版本调整) maven:3.6.3 依赖jar <dependency& ...
- Spring Boot 集成 Flyway 实现数据库版本控制
在项目迭代开发中,难免会有更新数据库 Schema 的情况,比如添加新表.在表中增加字段或者删除字段等,那么当我对数据库进行一系列操作后,如何快速地在其他同事的电脑上同步?如何在测试/生产服务器上快速 ...
最新文章
- java 自己抛空指针异常_java Timetask 访问service 抛空指针异常解决方案
- John细说PHP的验证码
- aboboo 上一句 快捷键_Word快捷键大全
- 设置ALV不同行的小数点位数
- js面向对象编程:this究竟代表什么?第二篇
- Python脚本备份数据库
- Carbon和Polacode教程
- 演练:调试 Windows 窗体
- mysql介绍索引类型的章节_MySQL索引类型介绍
- 杰·亚伯拉罕的产品营销35种策略完整版
- python 前后端分离框架_聊聊前后端分离的架构方法
- .NET 通过Word模板,使用AsposeWord进行数据动态导出Word
- 高中英语语法(001)-虚拟语气
- bootstrap fileupload 使用详解~~
- 32位和64位版本的Office异同点
- revit二次开发之程序调试
- 18907 雪花雪花雪花
- 百度编辑器(UEditor)自定义内容样式
- 【笔记】【JavaScript】JSchallenger-Arrays对象-练习笔记
- 天猫否认“大数据杀熟” 部分用户不买账联系消协:会员体系或受影响!