背景
第一次写文章,可能写的不是很好,如果大家有问题可以提出来!
最近我在研究定时任务的时候,看了好多都不太合适,在做完一个ScheduleThreadPoolExecutor的demo后,就遇到了Quartz这个任务调度框架,如题我现在是想把Spring Boot与Quartz整合,同时用Druid替换掉自带的C3P0连接池。
于是在这里就遇到问题了,我在网上找到的文章不是没有用SpringBoot的就是用了SpringBoot没有用Druid连接池的,还有就是用了SpringBoot和Druid,但是没有给详细配置信息的,于是我觉得写下这篇文章记录一下遇到的这些坑。
Springboot2.7.2集成Quartz+Druid
整合Quartz主要分为两步,引入依赖和写好配置文件即可,如果要引入Druid连接池,就还需要再写一个连接池的配置类,本文介绍的是引入Druid连接池的情况。
本次Quartz采用的是JDBC连接方式,相关Sql文件去官网下源码,在源码的包中
引入依赖
<!--Quartz任务调度框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>2.7.2</version>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
application.yml配置文件
server:
port: 8080
spring:
application:
name: quartz
quartz:
#数据库方式
job-store-type: jdbc
#相关属性配置
properties:
org:
quartz:
scheduler:
instanceName: DefaultQuartzScheduler
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
#自定义的数据源别名,与最下方一致
dataSource: qzDB
#与cron的调度有关,忽略重启期间的任务
misfireThreshold: 1000
#设置为true开启集群
isClustered: false
clusterCheckinInterval: 10000
#如果开启,会没法给任务传参数
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
dataSource:
qzDB:
#这里是坑点了,这个Druild连接类要自己提供,本文会在下方提供
connectionProvider.class: com.xxxxxxx.DruidConnectionProvider
maxConnection: 10
driver: com.mysql.cj.jdbc.Driver
URL: jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=utf-8&autoReconnect-true&useSSL=false&serverTimezone=Asia/Shanghai
user: xxx
password: xxx
Druid连接池配置类
在上方的yml配置文件中,最后面有一个connectionProvider.class: com.xxxxxxx.DruidConnectionProvider,没错!这个就是自己要提供的连接池配置类,之前看过好多文章在这里都是一笔带过了,坑了好久。
把这个类实现一下就ok了,具体如下:
@Data
public class DruidConnectionProvider implements ConnectionProvider {
//常量配置,需提供set方法,Quartz框架自动注入值。(这里用了Lombok的@Data,会自动生成getter和setter)
/**
* JDBC驱动
*/
public String driver;
/**
* JDBC连接串,必须是URL
*/
public String URL;
/**
* 数据库用户名,不是username
*/
public String user;
/**
* 数据库用户密码
*/
public String password;
/**
* 数据库最大连接数
*/
public int maxConnection;
/**
* 数据库SQL查询每次连接返回执行到连接池,以确保它仍然是有效的。
*/
public String validationQuery;
private boolean validateOnCheckout;
private int idleConnectionValidationSeconds;
public String maxCachedStatementsPerConnection;
private String discardIdleConnectionsSeconds;
public static final int DEFAULT_DB_MAX_CONNECTIONS = 10;
public static final int DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION = 120;
/**
* Druid连接池
*/
private DruidDataSource datasource;
//接口实现
@Override
public Connection getConnection() throws SQLException {
return datasource.getConnection();
}
@Override
public void shutdown() {
datasource.close();
}
@Override
public void initialize() throws SQLException {
if (this.URL == null) {
throw new SQLException("DBPool could not be created: DB URL cannot be null");
}
if (this.driver == null) {
throw new SQLException("DBPool driver could not be created: DB driver class name cannot be null!");
}
if (this.maxConnection < 0) {
throw new SQLException("DBPool maxConnections could not be created: Max connections must be greater than zero!");
}
datasource = new DruidDataSource();
try {
datasource.setDriverClassName(this.driver);
} catch (Exception e) {
try {
throw new SchedulerException("Problem setting driver class name on datasource: " + e.getMessage(), e);
} catch (SchedulerException ignored) {
}
}
datasource.setUrl(this.URL);
datasource.setUsername(this.user);
datasource.setPassword(this.password);
datasource.setMaxActive(this.maxConnection);
datasource.setMinIdle(1);
datasource.setMaxWait(0);
datasource.setMaxPoolPreparedStatementPerConnectionSize(DEFAULT_DB_MAX_CONNECTIONS);
if (this.validationQuery != null) {
datasource.setValidationQuery(this.validationQuery);
if (!this.validateOnCheckout) {
datasource.setTestOnReturn(true);
} else {
datasource.setTestOnBorrow(true);
}
datasource.setValidationQueryTimeout(this.idleConnectionValidationSeconds);
}
}
}
最后
到这里之后就已经完成了SpringBoot与Quartz以及Druid连接池的整合,如果有问题就直接问嗷!