springboot quartz 以持久化的方式实现定时任务

发布时间:2024-06-11 点击:222
这篇文章给大家介绍springboot quartz以持久化的方式实现定时任务,详情如下所示:
篇幅较长,耐心的人总能得到最后的答案小生第一次用quartz做定时任务,不足之处多多谅解。
首先
在springboot项目里做定时任务是比较简单的,最简单的实现方式是使用@scheduled注解,然后在application启动类上使用@enablescheduling开启定时任务。
示例
@springbootapplication@enableschedulingpublic class application { public static void main(string[] args) { springapplication.run(application.class, args); } // cron为每秒执行一次 @scheduled(cron = "* * * * * ?") public void print(){ system.out.println("执行定时任务"); }}######结果
执行定时任务
执行定时任务
执行定时任务
执行定时任务
执行定时任务
执行定时任务
执行定时任务
执行定时任务
简单的定时任务就可以用这种方式来做,cron表达式的结果为任务执行的间隔时间。
然而
实际开发中,我们的任务可能有很多,且需要手动操作单个/全部的任务,比如添加、开启、停止、继续等等操作。那么伴随着(千牛b类。。。)的bgm有请quartz登场。
quartz
整合
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-quartz</artifactid> </dependency>quartz的三要素
调度器scheduler启动触发器去执行任务触发器trigger
用来定义job(任务)触发条件、触发时间,触发间隔,终止时间等
任务job
具体要执行的任务内容
使用
使用quartz是需要配置文件的,quartz.properties在quartz的jar包的org.quartz包下可以找到默认的配置文件quartz.properties
# default properties file for use by stdschedulerfactory# to create a quartz scheduler instance, if a different# properties file is not explicitly specified.## 名字org.quartz.scheduler.instancename: defaultquartzschedulerorg.quartz.scheduler.rmi.export: falseorg.quartz.scheduler.rmi.proxy: falseorg.quartz.scheduler.wrapjobexecutioninusertransaction: false# 实例化threadpool时,使用的线程类为simplethreadpoolorg.quartz.threadpool.class: org.quartz.simpl.simplethreadpool# 线程总个数org.quartz.threadpool.threadcount: 10# 线程的优先级org.quartz.threadpool.threadpriority: 5org.quartz.threadpool.threadsinheritcontextclassloaderofinitializingthread: trueorg.quartz.jobstore.misfirethreshold: 60000# 持久化方式,默认持久化在内存中,后面我们使用db的方式org.quartz.jobstore.class: org.quartz.simpl.ramjobstorequartz任务持久化到db则需要一些官方定义的数据库表,表的sql文件可以在quartz的jar包里找到
坐标org.quartz.impl.jdbcjobstore,可以看到里面有很多sql文件,有各种数据库的,咱们用mysql的,咱们不需要手动执行sql语句,后面咱们在启动项目的时候自动初始化。
创建我们自己的properties文件
# 实例化threadpool时,使用的线程类为simplethreadpoolorg.quartz.threadpool.class=org.quartz.simpl.simplethreadpool# threadcount和threadpriority将以setter的形式注入threadpool实例# 并发个数org.quartz.threadpool.threadcount=10# 优先级org.quartz.threadpool.threadpriority=5org.quartz.threadpool.threadsinheritcontextclassloaderofinitializingthread=trueorg.quartz.jobstore.misfirethreshold=5000#持久化使用的类org.quartz.jobstore.class=org.quartz.impl.jdbcjobstore.jobstoretx#数据库中表的前缀org.quartz.jobstore.tableprefix=qrtz_#数据源命名org.quartz.jobstore.datasource=qzds#qzds 数据源,我们使用hikaricp,默认的是c3p0org.quartz.datasource.qzds.provider=hikaricporg.quartz.datasource.qzds.driver=com.mysql.cj.jdbc.driverorg.quartz.datasource.qzds.url=jdbc:mysql://localhost:3306/quartz?useunicode=true&characterencoding=utf-8&servertimezone=gmt+8org.quartz.datasource.qzds.user=rootorg.quartz.datasource.qzds.password=123456org.quartz.datasource.qzds.maxconnections=10既然我们没有使用默认的连接池,那么就探索一下,上源码!在这个包下:org.quartz.utils,有一个poolingconnectionprovider,顾名思义,连接池提供者部分源码
public interface poolingconnectionprovider extends connectionprovider { / the pooling provider. */ string pooling_provider = "provider"; / the c3p0 pooling provider. */ string pooling_provider_c3p0 = "c3p0"; / the hikari pooling provider. */ string pooling_provider_hikaricp = "hikaricp";}然后hikaricppoolingconnectionprovider这个类实现了poolingconnectionprovider,自行查看。我们可以在org.quartz.impl下的stdschedulerfactory中搜索c3p0找到
if(poolingprovider != null && poolingprovider.equals(poolingconnectionprovider.pooling_provider_hikaricp)) { cpclass = "org.quartz.utils.hikaricppoolingconnectionprovider"; } else { cpclass = "org.quartz.utils.c3p0poolingconnectionprovider"; }剩下的自己多看看吧,起始源码研究起来没有想象中那么难那么乏味(我也不喜欢看源码),但是这个源码看起来确实小有成就感。
回到正题频道,配置application.yml
spring: datasource: driver-class-name: com.mysql.cj.jdbc.driver url: jdbc:mysql://localhost:3306/quartz?characterencoding=utf8&usessl=false&serve

域名服务是什么意思?
日本没有用户体验——从日本的生活品质看设计
HTML页面的基本代码结构是什么?
虚拟云主机和云服务器有什么区别
域名绑定不了-域名及账户问题
新用户云服务器怎么安装
深圳ecs云服务器到期取消备案
腾讯云服务器多少岁可以备案登记了