quartz持久化進DB

項目中涉及到定時任務,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相關配置會自動持久化進相應表中
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章