项目中涉及到定时任务,quartz应用广泛,大部分项目只用到它的内存持久化模式,如果想在不重启应用的情况下实时修改job执行时间,就涉及到quartz的DB持久化。
首先根据数据库的不同建立框架所需的表,建表语句自行百度,这里不多做记录。
1…环境信息:springboot 2.1.0
quartz依赖:
org.springframework.boot
spring-boot-starter-quartz
2.新建两个配置文件:
对应配置:
#持久化quartz相关配置
#============================================================================
# 基础配置
#============================================================================
# 设置调度器的实例名(instanceName) 和实例ID (instanceId)
# 注意:如果使用JobStoreTX,实例名严禁使用:DefaultQuartzScheduler
# 原因:内存方式的instanceid为默认的DefaultQuartzScheduler,如果不修改系统会同时存在内存型和DB型,默认会走内存
org.quartz.scheduler.instanceName: MyQuartzScheduler
#如果使用集群,instanceId必须唯一,设置成AUTO
org.quartz.scheduler.instanceId: AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
#============================================================================
# 调度器线程池配置
#============================================================================
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
# 指定多少个工作者线程被创建用来处理 Job
org.quartz.threadPool.threadCount: 10
# 设置工作者线程的优先级(最大值10,最小值1,常用值5)
org.quartz.threadPool.threadPriority: 5
# 加载任务代码的ClassLoader是否从外部继承
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
#============================================================================
# Configure JobStore 作业存储配置
#============================================================================
# 默认配置,数据保存到内存(调度程序信息是存储在被分配给JVM的内存里面,运行速度快)
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
# 持久化配置(存储方式使用JobStoreTX,也就是数据库)
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
# 驱动器方言
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#是否使用集群(如果项目只部署到 一台服务器,就不用了)
org.quartz.jobStore.isClustered:false
#org.quartz.jobStore.clusterCheckinInterval:20000
# 使用自己的配置文件
org.quartz.jobStore.useProperties:true
#数据库中quartz表的表名前缀
org.quartz.jobStore.tablePrefix:QRTZ_
#org.quartz.jobStore.dataSource:myTest
#============================================================================
# Configure DataSources配置数据源(可被覆盖,如果在schedulerFactoryBean指定数据源)
#============================================================================
#org.quartz.dataSource.myTest.driver:com.mysql.jdbc.Driver
#org.quartz.dataSource.myTest.URL:jdbc:mysql://localhost:3306/myTest
#org.quartz.dataSource.myTest.user:root
#org.quartz.dataSource.myTest.password:root1234
#org.quartz.dataSource.myTest.maxConnection:10
#org.quartz.dataSource.myTest.validateOnCheckout:true
#org.quartz.dataSource.myTest.validationQuery:select 'x'```
<?xml version="1.0" encoding="UTF-8"?>
<bean id= "testJobDetailBean"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="name" value="exampleJob1" />
<!--持久化后必须为true 否则抛异常-->
<property name="durability" value="true"/>
<!--job中断后是否自动恢复-->
<property name="requestsRecovery" value="true"/>
<property name="jobClass" value="com.example.demo.quartzJob.SpringbootQuartzOne"/>
</bean >
<!--为job配置触发时间1-->
<bean id="testTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testJobDetailBean" />
<property name="cronExpression" value="${spring.quartz.corn1}" />
<property name="misfireInstruction" value="2"/>
</bean >
<bean id= "testDataSourceJobBean"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="name" value="exampleJob2" />
<!--持久化后必须为true 否则抛异常-->
<property name="durability" value="true"/>
<!--job中断后是否自动恢复-->
<property name="requestsRecovery" value="true"/>
<property name="jobClass" value="com.example.demo.quartzJob.SpringbootQuartzTwo"/>
</bean >
<!--为job配置触发时间2-->
<bean id="testDataSourceJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testDataSourceJobBean" />
<property name="cronExpression" value="${spring.quartz.corn}" />
<property name="misfireInstruction" value="2"/>
</bean >
<bean id= "testBothJobDetailBean"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="name" value="exampleJob3" />
<!--持久化后必须为true 否则抛异常-->
<property name="durability" value="true"/>
<!--job中断后是否自动恢复-->
<property name="requestsRecovery" value="true"/>
<property name="jobClass" value="com.example.demo.quartzJob.JobDetailBean"/>
<property name="jobDataAsMap">
<map>
<entry key="targetObject" value="createDetailedListJob"/>
<entry key="targetMethod" value="execute"/>
</map>
</property>
</bean >
<!--为springBatch配置触发时间-->
<bean id="testBothTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testBothJobDetailBean" />
<property name="cronExpression" value="${springBatch.quartz.corn}" />
<property name="misfireInstruction" value="2"/>
</bean >
<!--将调度器加入调度工厂-->
<bean id= "testSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="applicationContextSchedulerContextKey" value="applicationContext"/>
<property name="configLocation" value="classpath:quartz.properties"/>
<property name="overwriteExistingJobs" value="true"/>
<property name="startupDelay" value="5"/>
<property name="autoStartup" value="true"/>
<property name="triggers" >
<list>
<!--<ref bean="testTaskTrigger" />-->
<ref bean="testBothTaskTrigger" />
<!--<ref bean="testDataSourceJobTrigger" />-->
</list>
</property>
<!--自定义jobFactory 解决service无法注入问题-->
<property name="jobFactory">
<bean class="com.example.demo.quartzJob.QuartzBeanUtil" />
</property>
</bean>
```
3.启动项目 quart相关配置会自动持久化进相应表中