項目中涉及到定時任務,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相關配置會自動持久化進相應表中