SpringBoot下Quartz使用JDBC JobStore

上一次咱们在SpringBoot2.x整合Quartz这篇文章中已经搞定了Quartz的整合。
另外在SpringBoot简单定时任务@Schedule可知,如果我们不需要在程序运行中动态创建、修改、删除定时任务,那么我们可以使用SpringBoot自带的定时任务注解来完成定时任务。
如果我们需要在程序运行中动态控制定时任务,那么就必须使用到Quartz框架了。
首先我们知道Quartz默认是将job信息存在内存中的,即使用的RAMJobStore。
如果我们重启程序,程序运行中动态添加或修改的job就会丢失,这显然不是我们希望见到的。
对此我们有两种处理方式。

方法一

在修改定时任务的时候,对应的将定时任务信息写入到数据库中,之后每次启动程序,都需要从数据库中读取定时任务信息。
这种方式的优点,也就是RAMJobStore的优点,因为信息存在内存中,所以相对比较快。
但是缺点也很明显,自己需要写的代码很多,甚至代码可能会有bug。

方法二

使用JDBCJobStore。
很明显,Quartz可以自己通过JDBC将定时任务信息存入数据库中,并且正常的触发job。
他的优点是我们不需要写过多的代码,也(几乎)不用担心bug导致任务没有正常触发。
对应的缺点即需要我们多做一点配置。

1.我们需要创建JDBCJobStore需要的数据库表,这个可以在下载的压缩文件包的docs\dbTables\下找到。我是在2.2.3的压缩包中找到的,在2.3.0中没有找到,但是并不影响我们使用。它支持很多数据库,找到对应的数据库脚本执行即可。

2.添加配置

spring:
  quartz:
    job-store-type: jdbc
    properties:
      org:
        quartz:
          scheduler:
            instanceName: clusteredScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_
            useProperties: false
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://dbhost:3306/yourDatabaseName
    username: username
    password: password

运行后控制台可以看到

2019-03-18 21:01:07.866  INFO 12352 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler meta-data: Quartz Scheduler (v2.3.0) 'clusteredScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.springframework.scheduling.quartz.LocalDataSourceJobStore' - which supports persistence. and is not clustered.

方法二只是多了一点点配置,但是可以避开方法一的很多坑,所以一般来说推荐方法二。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据