Springboot+quartz整合(多数据源)
谈谈
最近在公司需要做一个定时任务管理的小项目,心想采用Springboot和quartz能减少不少配置,迅速完成项目搭建和开发。以前做过SpringMVC中配置定时任务,都是在xml配置文件中配置一大堆bean来实现任务的配置与存储,所以这次也同样在pom文件中导入
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
但是经过一番折腾,由于知识的浅薄,通过配置文件配置quartz持久化到数据库失败了。
无意间看到一个叫 Spring-boot-starter-quartz 的包,立马去百度查,这才知道,原来Springboot早已经集成了quartz。于是从新导入新的quartz依赖,进行一番配置后,终于大功告成。
下面简单介绍一下我的配置方式。
还是老样子,如果发现有错误或则有待提升的地方,欢迎各位大佬指出来!
导入quartz依赖
既然用springboot做项目,那咱们还是老老实实导入spring家族的依赖吧。一切为了简化配置。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
初始化quartz持久化所需要的数据库表
官方提供了初始化数据库所需要的脚本,下载链接http://www.quartz-scheduler.org/downloads/files/quartz-2.2.3-distribution.tar.gz。不同数据库使用不同的脚本不一样,下载后通过解压路径/quartz-2.2.3/docs/dbTables/可以看到有很多类型的脚本,找到适合自己数据库的就行。我用的mysql,所以打开tables_mysql.sql,复制其中的内容到数据库工具执行一遍就ok。
运行完成后,可以看到数据库有以下表,通过表明容易理解其用途。
其中
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
这个配置需要根据不同数据库类型,设置到yml配置文件中
配置yml文件
这里有一部分涉及到多数据源配置,因为公司项目涉及到多种数据库和多个表的操作,所以我将quartz持久化所需要的表放到了新的数据库task下边。
spring:
datasource:
#数据源1
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.137.53:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: mysqlpassword
type: com.alibaba.druid.pool.DruidDataSource
#数据源2
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.137.53:3306/db2?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: mysqlpassword
type: com.alibaba.druid.pool.DruidDataSource
#quartz数据源
task:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.137.53:3306/task?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: mysqlpassword
type: com.alibaba.druid.pool.DruidDataSource
quartz:
properties:
org:
quartz:
scheduler:
instanceName: DemoScheduler
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate #跟数据库初始化脚本中配置保持一致
tablePrefix: QRTZ_
isClustered: true
clusterCheckinInterval: 10000
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 20
threadPriority: 5
threadsInheritContextClassLoaderOfInitializingThread: true
job-store-type: jdbc
overwrite-existing-jobs: true
auto-startup: true
quartz数据源配置
在yml配置文件中我们配置了三个数据源,一个是task,存储持久化quartz的数据表;其他两个当作是业务数据源,可能来自不同的数据库。
多数据源配置可以参考我之前的文章Springboot+Mybatis+MySql整合多数据源及其使用
新建DataSourceConfig类,配置三个数据源,并通过@QuartzDataSource告诉spring容器quartz使用的数据源是哪一个。
@Configuration
@MapperScan(basePackages = "com.czhjsl.dao")
public class DataSourceConfig {
@Bean(name = "dataSource1")
@Primary
@ConfigurationProperties("spring.datasource.db1")
public DruidDataSource dataSource1 () {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dataSource2")
@ConfigurationProperties("spring.datasource.db2")
public DruidDataSource dataSource2 () {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dataSourceTask")
@ConfigurationProperties("spring.datasource.task")
@QuartzDataSource
public DruidDataSource dataSourceTask () {
return DruidDataSourceBuilder.create().build(); }
@Bean(name = "myRoutingDataSource")
public MyRoutingDataSource myRoutingDataSource (@Qualifier("dataSource1") DruidDataSource dataSource1,
@Qualifier("dataSource2") DruidDataSource dataSource2) {
Map<Object, Object> map = new HashMap<>();
map.put(DataSourceType.DB1, dataSource1);
map.put(DataSourceType.DB2, dataSource2);
MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();
myRoutingDataSource.setTargetDataSources(map);
myRoutingDataSource.setDefaultTargetDataSource(dataSource1);
return myRoutingDataSource;
}
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory (@Qualifier("dataSource1") DruidDataSource dataSource1,
@Qualifier("dataSource2") DruidDataSource dataSource2) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(myRou