很久以前就用过 quartz, 现在重新用起, 主要实现集群方式启动, 并且支持多数据源注入到 job 中. 网上 demo 很多, 方法大同小异. 但关于数据源注入的深入介绍不多, 不错的文章:《spring-boot-2.0.3 之 quartz 集成, 数据源问题, 源码探究 https://www.cnblogs.com/youzhibing/p/10056696.html 》, 作者关于 quartz 有 3 篇, 都值得一看.
总结一下: mybatis 不是必须的, springboot 会自动将数据源注入到 quartz(前提是你的配置正确). 本地化的 job 类也不是必须的, 创建一个类主要是控制任务时传参数.
理论上来说, 在数据库中建好 quartz 的表, 在 pom 中加入相关依赖, 配置好 quartz 的属性, 无需额外编码, 就可以让 quartz 跑起来. 只是这种情况没有任何任务, 需要对任务进行增删改启停就需要实现一个 service 来操作 job, 这个类网上的 demo 几乎都一样, 实现控制 job 的方法都是调用 quartz 的方法.
要记录的有几点:
1, 我还没有彻底弄清 job 的各种特性, 包括任务的调度等, 先从基本功能开始, 满足业务需要即可.
2, 踩了两个坑, 一个是依赖问题, 在 IDEA 中可以顺畅的跑, 但部署到服务器运行就会报错 (mybatis 相关). 琢磨了很久, 没找到原因, 无意中发现可能是依赖冲突导致, 于是从零开始, 力求最少依赖方式, 我的依赖见下. 第二个坑, 使用了企业自研的分布式数据库 (MySQL), 结果本机 MySQL 正常, 连企业数据库就报错:"Unknown column'0x'in'field list'. 最后 dba 查日志发现是在向 trigger 表插入数据时 blob 字段没按要求将 0x 用引号包起来.
3, 接下来还需要尝试使用 jar 进行任务定制, 实现不动框架就可以对 job 进行定制.
附 pom 及 properties:
pom.xml, 其中的 mybatis 是因为 job 要访问业务数据库才加入的依赖.
- <dependencies>
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>RELEASE</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.6</version>
- </dependency>
- <dependency>
- <groupId>commons.NET</groupId>
- <artifactId>commons.NET</artifactId>
- <version>3.6</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-quartz -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-quartz</artifactId>
- <version>RELEASE</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid-spring-boot-starter</artifactId>
- <version>RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-tomcat</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>5.1.47</version>
- </dependency>
- <dependency>
- <groupId>com.oracle</groupId>
- <artifactId>ojdbc8</artifactId>
- <version>12.2.0.1</version>
- </dependency>
- </dependencies>
application.properties. 使用了 druid 的主从数据源 (需要定义额外的配置类),quartz 的表格部署在主库上, springboot 默认将主库数据源注入到了 quartz.
- #quartz 相关属性配置
- spring.quartz.properties.org.quartz.scheduler.instanceName=myTasks
- spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
- spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
- spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
- spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
- spring.quartz.properties.org.quartz.jobStore.isClustered=true
- spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=10000
- spring.quartz.properties.org.quartz.jobStore.useProperties=false
- spring.quartz.properties.org.quartz.jobStore.dataSource=qzDS
- spring.quartz.properties.org.quartzthreadPool.class=org.quartz.simpl.SimpleThreadPool
- spring.quartz.properties.org.quartzthreadPool.threadCount=10
- spring.quartz.properties.org.quartzthreadPool.threadPriority=5
- spring.quartz.properties.org.quartzthreadPool.threadsInheritContextClassLoaderOfInitializingThread=true
- # 数据库方式
- spring.quartz.job-store-type=JDBC
- # 初始化表结构
- spring.quartz.jdbc.initialize-schema=NEVER
- ## MySQL 数据源配置, 主库 Primary
- # via local
- MySQL.datasource.druid.url = jdbc:MySQL://localhost:3306/MySQL?useUnicode=true&characterEncoding=utf8&useSSL=false
- MySQL.datasource.druid.username=root
- MySQL.datasource.druid.password=123456
- MySQL.datasource.druid.driverClassName=com.MySQL.jdbc.Driver
- # 监控统计拦截的 filters
- MySQL.datasource.druid.filters=stat
- # 配置初始化大小 / 最小 / 最大
- MySQL.datasource.druid.initialSize=1
- MySQL.datasource.druid.minIdle=1
- MySQL.datasource.druid.maxActive=20
- # 获取连接等待超时时间
- MySQL.datasource.druid.maxWait=60000
- # 间隔多久进行一次检测, 检测需要关闭的空闲连接
- MySQL.datasource.druid.timeBetweenEvictionRunsMillis=60000
- # 一个连接在池中最小生存的时间
- MySQL.datasource.druid.minEvictableIdleTimeMillis=300000
- MySQL.datasource.druid.validationQuery=SELECT 'x'
- MySQL.datasource.druid.testWhileIdle=true
- MySQL.datasource.druid.testOnBorrow=false
- MySQL.datasource.druid.testOnReturn=false
- # 打开 PSCache, 并指定每个连接上 PSCache 的大小. oracle 设为 true,MySQL 设为 false. 分库分表较多推荐设置为 false
- MySQL.datasource.druid.poolPreparedStatements=false
- MySQL.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
- ## Oracle 数据源配置, 从库
- oracle.datasource.druid.url=jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=scot)))
- oracle.datasource.druid.username=root
- oracle.datasource.druid.password=123456
- oracle.datasource.druid.driverClassName=oracle.jdbc.OracleDriver
- # 监控统计拦截的 filters
- oracle.datasource.druid.filters=stat
- # 配置初始化大小 / 最小 / 最大
- oracle.datasource.druid.initialSize=1
- oracle.datasource.druid.minIdle=1
- oracle.datasource.druid.maxActive=20
- # 获取连接等待超时时间
- oracle.datasource.druid.maxWait=60000
- # 间隔多久进行一次检测, 检测需要关闭的空闲连接
- oracle.datasource.druid.timeBetweenEvictionRunsMillis=60000
- # 一个连接在池中最小生存的时间
- oracle.datasource.druid.minEvictableIdleTimeMillis=300000
- oracle.datasource.druid.validationQuery=SELECT 'x' FROM DUAL
- oracle.datasource.druid.testWhileIdle=true
- oracle.datasource.druid.testOnBorrow=false
- oracle.datasource.druid.testOnReturn=false
- # 打开 PSCache, 并指定每个连接上 PSCache 的大小. oracle 设为 true,MySQL 设为 false. 分库分表较多推荐设置为 false
- oracle.datasource.druid.poolPreparedStatements=true
- oracle.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
来源: http://www.bubuko.com/infodetail-3272990.html