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相关配置会自动持久化进相应表中
在这里插入图片描述

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