SpringBoot系列:Spring Boot集成定时任务Quartz
一、关于Quartz
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。在java企业级应用中,Quartz是使用最广泛的定时调度框架。
在Quartz中的主要概念:
- Scheduler:调度任务的主要API
- ScheduleBuilder:用于构建Scheduler,例如其简单实现类SimpleScheduleBuilder
- Job:调度任务执行的接口,也即定时任务执行的方法
- JobDetail:定时任务作业的实例
- JobBuilder:关联具体的Job,用于构建JobDetail
- Trigger:定义调度执行计划的组件,即定时执行
- TriggerBuilder:构建Trigger
一、Quartz演示示例
在SpringBoot中,我们需要引入quartz的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--quartz定时调度依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
首先定义定时具体执行逻辑Job,创建类QuartzJob1,这里集继承QuartzJobBean实现executeInternal即可,该方法即定时执行任务逻辑,这里简单打印了下当前时间。
public class QuartzJob1 extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("QuartzJob1----" + sdf.format(new Date()));
}
}
然后创建QuartzConfig,接着定义JobDetail,JobDetail由JobBuilder构建,同时关联了任务QuartzJob1。
@Configuration
public class QuartzConfig {
@Bean
public JobDetail jobDetail1(){
return JobBuilder.newJob(QuartzJob1.class).storeDurably().build();
}
}
最后我们需要定义定时调度Trigger,简单实现类SimpleScheduleBuilder用于构建Scheduler,TriggerBuilder则用于构建Trigger,
@Configuration
public class QuartzConfig {
@Bean
public JobDetail jobDetail1(){
return JobBuilder.newJob(QuartzJob1.class).storeDurably().build();
}
@Bean
public Trigger trigger1(){
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1) //每一秒执行一次
.repeatForever(); //永久重复,一直执行下去
return TriggerBuilder.newTrigger()
.forJob(jobDetail1())
.withSchedule(scheduleBuilder)
.build();
}
}
这样一个Quartz定时任务就配置完成了。
其实Job的定义也可以使用内部类,这样可以省去Job类的创建,例如下面定时任务2 jobDetail2和trigger2。
@Bean
public JobDetail jobDetail2(){
QuartzJobBean quartzJob2 = new QuartzJobBean() {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("内部类quartzJob2----" + sdf.format(new Date()));
}
};
return JobBuilder.newJob(quartzJob2.getClass()).storeDurably().build();
}
@Bean
public Trigger trigger2(){
//JobDetail的bean注入不能省略
//JobDetail jobDetail3 = JobBuilder.newJob(QuartzJob2.class).storeDurably().build();
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2) //每2秒执行一次
.repeatForever(); //永久重复,一直执行下去
return TriggerBuilder.newTrigger()
.forJob(jobDetail2())
.withSchedule(scheduleBuilder).build();
}
启动程序,我们就可以看到控制台的时间输出了。

同时Quartz是支持数据持久化的,可以将定时调度信息持久化到数据库。
选择持久化到数据库,我们需要创建对应的表,建表语句可以在Quartz官网进行下载,解压后在docs\dbTables目录下寻找对应数据库的SQL脚本。
为了方便,我也将该文件放在了项目源码resources里。
操作数据库,我们引入相关的依赖。若有ORM框架,例如mybatis,hibernate或者jpa,则无需再引入jdbc依赖。
<!--mysql连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--jdbc依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
在application.yml配置文件中,我们对quartz持久化方式进行声明。
server:
port: 10900
spring:
profiles:
active: dev
quartz:
job-store-type: jdbc #持久化到数据库
properties:
org:
quartz:
datasource:
# 新版驱动从com.mysql.jdbc.Driver变更为com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver
# 数据源需要添加时间标准和指定编码格式解决乱码 You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 1234
scheduler:
instancName: clusteredScheduler
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate #StdJDBCDelegate说明支持集群
tablePrefix: QRTZ_
isClustered: true
clusterCheckinInterval: 1000
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 20
threadPriority: 5
这里主要就是job-store-type: jdbc,表示持久化到数据库,然后就是数据源,由于该演示项目没有其他ORM的数据源,所以这里将数据源信息定义在了quartz节点下的datasource节点,如果已经存在,可使用同一个属性配置,当然最关键的是QuartzDataSource声明。
这里关键的是@QuartzDataSource,这个要和项目中已经存在的数据源区分开。
//Error:EmbeddedDatabaseType class not found,Druid数据源初始化需要引入spring-jdbc依赖,JPA或mybatis依赖已经包含该依赖
@Bean
@QuartzDataSource
@ConfigurationProperties(prefix = "spring.quartz.properties.org.quartz.datasource")
DataSource quartzDataSource(){
return DruidDataSourceBuilder.create().build();
}
这样持久化就已经配置好了,我们执行sql,再启动项目,启动完成后,我们可以看到数据库中已经有我们的定时调度数据了。

源码地址:https://github.com/imyanger/springboot-project/tree/master/p25-springboot-quartz
SpringBoot系列:Spring Boot集成定时任务Quartz的更多相关文章
- SpringBoot(十一): Spring Boot集成Redis
1.在 pom.xml 中配置相关的 jar 依赖: <!-- 加载 spring boot redis 包 --> <dependency> <groupId>o ...
- 【SpringBoot】Spring Boot 集成SwaggerAPI
Spring Boot 集成SwaggerAPI 文章目录 Spring Boot 集成SwaggerAPI Swagger 添加依赖 配置类 config 控制类 controller 接口测试 页 ...
- Spring Boot集成持久化Quartz定时任务管理和界面展示
本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot. 本工程所用到的技术或工具 ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用EhCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- Quartz与Spring Boot集成使用
上次自己搭建Quartz已经是几年前的事了,这次项目中需要定时任务,需要支持集群部署,想到比较轻量级的定时任务框架就是Quartz,于是来一波. 版本说明 通过搜索引擎很容易找到其官网,来到Docum ...
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- Spring Boot集成Quartz注入Spring管理的类
摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入. Spring有自己的Schedule定时任务,在S ...
- Spring Boot系列教程十:Spring boot集成Sentinel Redis
前言 上一篇文章介绍了spring boot集成单点的redis,然而实际生产环境使用单点的redis风险很高,一旦宕机整个服务将无法使用,这篇文章介绍如何使用基于sentinel的redis高可用方 ...
随机推荐
- 实现一个3D图片轮播插件 —— 更新版
前言: 前段时间写下了之前那篇 3D图片轮播效果,后来发现了 Pedro Botelho 写的jquery.gallery.js ,于是重新修改了自己的这个图片轮播,使之可以成为一个插件来使用 ...
- MongoDB 学习笔记之 group聚合
group聚合: key: 分组字段 cond:过滤条件 reduce: curr是当前行 result是每组的结果集 initial : 组变量初始值 finalize: 统计一组后的回调函数 用g ...
- ef core实现软删除
很多web程序一般的偶不会设计真的物理删除了. 基本上都是在在数据库加一个标记,就得当作已经删除了.同时在查询的时候,过滤已经标记删除的数据 ef core实现软删除是非常简单的,直接在OnModel ...
- git分支的创建、删除、切换、合并
需求背景 开发新功能和修改bug一般放在新建分支,如果觉得可行,可以合并到master分支上. 方式 1.查看分支 git branch (查看本地分支及当前所属分支) git branch -a ( ...
- Java BIO及实现
发现日常学习过的知识不久就会遗忘,在此只是整理并记录一下学习笔记,做个回忆,并方便以后查阅,若有错误,欢迎指正 网络模型:TCP/IP网络模型是从OSI七层模型中演化来的,osi模型分为物理层,数据链 ...
- Json模块(dumps、loads、dump、load)函数篇
# dumps.loads函数 """json.dumps()用于将dict类型的数据转成strjson.loads()用于将str类型的数据转成dict. " ...
- 全面系统Python3入门+进阶课程 ✌✌
全面系统Python3入门+进阶课程 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 无论是大数据.人工智能还是机器学习,Python都是最热门的首选语言 ,这 ...
- Travis CI持续集成使用
用好这个工具不仅可以提高效率,还能使开发流程更可靠和专业化,从而提高软件的价值.而且,它对于开源项目是免费的,不花一分钱,就能帮你做掉很多事情. 一.什么是持续集成? Travis CI 提供的是持续 ...
- Kali Linux开启ssh服务设置自启
几天没写 水一些今天遇到的问题 0x01 配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#PasswordAuthentication ...
- [JZOJ5781]【NOIP提高A组模拟2018.8.8】秘密通道
Description 有一副n*m的地图,有n*m块地,每块是下列四种中的一种:墙:用#表示,墙有4个面,分别是前面,后面,左面,右面.起点:用C表示,为主角的起点,是一片空地.终点:用F表示,为主 ...