Quartz提供两种基本作业存储类型
--->第一种类型叫做RAMJobStore:
     最佳的性能,因为内存中数据访问最快
     不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失
--->第二种类型叫做JDBC作业存储:
     通过调整其quartz.properties属性文件,持久化任务调度信息
     使用数据库保存任务调度信息后,即使系统崩溃后重新启动,任务的调度信息将得到恢复

如果部署应用多台服务器,定时任务在同一时刻只能有一个节点执行,那就必须使用第二种方案:持久化任务调度,通过Quartz默认的集群方案,保证同一时刻相同触发器定时任务,只有一个节点去执行此任务!!!如果该节点执行失败,则此任务则会被分派到另一节点执行,中途也会自动检查失效的定时调度,发现不成功的,其他节点立马接过来继续完成定时任务。

默认的配置文件如下:

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
# StdSchedulerFactory使用quartz.properties 创建一个Quartz Scheduler实例
# 参数请参考:http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/
#
# Quartz提供两种基本作业存储类型
# --->第一种类型叫做RAMJobStore:
# 最佳的性能,因为内存中数据访问最快
# 不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失
# --->第二种类型叫做JDBC作业存储:
# 通过调整其quartz.properties属性文件,持久化任务调度信息
# 使用数据库保存任务调度信息后,即使系统崩溃后重新启动,任务的调度信息将得到恢复
# #============================================================================
# 基础配置
#============================================================================ # 设置调度器的实例名(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.useProperties:true #数据库中quartz表的表名前缀
org.quartz.jobStore.tablePrefix:qrtz_
org.quartz.jobStore.dataSource:myQuartzDB #是否使用集群(如果项目只部署到 一台服务器,就不用了)
org.quartz.jobStore.isClustered = true #============================================================================
# Configure Datasources配置数据源(可被覆盖,如果在schedulerFactoryBean指定数据源)
#============================================================================ org.quartz.dataSource.myQuartzDB.driver:oracle.jdbc.OracleDriver
org.quartz.dataSource.myQuartzDB.URL:jdbc:oracle:thin:@10.132.81.134:1521:dsdb1
org.quartz.dataSource.myQuartzDB.user:masmf
org.quartz.dataSource.myQuartzDB.password:masmf
org.quartz.dataSource.myQuartzDB.maxConnections:10

其中,定义了Quartz的数据源。

如果Quartz的表结构和应用的表结构部署在同一个DB的schema下,则可以使用应用的datasource。我这里使用的SpringBoot,代码如下:

/**
* 配置SchedulerFactoryBean
*
* @return
* @throws IOException
*/
@Bean //将一个方法产生为Bean并交给Spring容器管理(@Bean只能用在方法上)
public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("primaryDataSource") DataSource dataSource)
throws IOException {
//Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期
SchedulerFactoryBean factory = new SchedulerFactoryBean();
//启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
//factory.setOverwriteExistingJobs(true);
// 延时启动(秒)
//factory.setStartupDelay(20);
//设置quartz的配置文件
Properties QuartzPropertie = quartzProperties();
factory.setQuartzProperties(QuartzPropertie); //设置数据源(使用系统的主数据源,覆盖propertis文件的dataSource配置)
factory.setDataSource(dataSource); //设置自定义Job Factory,用于Spring管理Job bean
factory.setJobFactory(myJobFactory);
return factory;
}

关键代码就2行:

1、注入应用的datasource:@Qualifier("primaryDataSource") DataSource dataSource

2、设置datatasource:factory.setDataSource(dataSource)

这里会自动覆盖quartz.properties配置的数据源

如果使用xml配置,如下:

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="overwriteExistingJobs" value="true"/>
<property name="configLocation" value="classpath:quartz.properties"/>
</bean>

具体SpringBoot下如何继承Quartz,请参考前一片文章:SpringBoot集成Quartz

参考文章

SchedulerFactoryBean的初始化分析

quartz的持久化任务调度使用应用的dataSource的更多相关文章

  1. SpringBoot整合任务调度框架Quartz及持久化配置

    目录 本篇要点 SpringBoot与Quartz单机版快速整合 引入依赖 创建Job 调度器Scheduler绑定 自动配置,这里演示SimpleScheduleBuilder 手动配置,这里演示C ...

  2. spring整合quartz并持久化

    spring整合quartz有两种方式: 一.常见是使用配置文件,将定时任务保存到内存中 简单示例: <!-- 短信催还提醒任务调度 --> <bean id="overd ...

  3. spring整合Quartz2持久化任务调度

    转摘 https://blog.csdn.net/qwe6112071/article/details/50999386 因为通过Bean配置生成的JobDetail和CronTrigger或Simp ...

  4. 使用Quartz.NET进行任务调度管理

    1.Quartz.NET 介绍 Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用 ...

  5. springboot+quartz以持久化的方式实现定时任务

    springboot+queue以持久化的方式实现定时任务 篇幅较长,耐心的人总能得到最后的答案 小生第一次用quartz做定时任务,不足之处多多谅解. 首先 在springboot项目里做定时任务是 ...

  6. Quartz.NET 的任务调度管理工具

    [更新] 基于Quartz.NET 的任务调度管理工具   更新列表: 任务参数可视化. 立即中断正在执行的任务. 每个任务独立的应用程序域 上一版参见: 基于Quqrtz.NET 做的任务调度管理工 ...

  7. 项目ITP(六) spring4.0 整合 Quartz 实现动态任务调度

    前言 系列文章:[传送门] 项目需求: http://www.cnblogs.com/Alandre/p/3733249.html 上一博客写的是基本调度,后来这只能用于,像每天定个时间 进行数据库备 ...

  8. Quartz是一个任务调度

    这段时间做一个案子,用到每天定时处理事件,之前的解决思路是通过一个定时器轮询时间段,这样不能精准的在某个时间戳上执行动作.由于没有用过Quartz是一个任务调度,一直使用这个办法,今天通过同事提点,从 ...

  9. Hosted Services+Quartz实现定时任务调度

    背景 之前.net core使用quartz.net时,总感觉非常变扭,百度和谷歌了N久都没解决以下问题,造成代码丑陋,非常不优雅: 1.项目启动时,要立刻恢复执行quartz.net中的任务 2.q ...

随机推荐

  1. html-3

    <hr> 下划线实体:想在页面显示被浏览器解析的内容为表格添加标题<caption>跟tr同级,只在<table>下 <link> 为页面加小图标 在& ...

  2. 虚拟机安装MySQL报** is needed by **错误

    执行命令: [root@node1 local]# rpm -ivh mysql-community-server-8.0.12-1.el7.x86_64.rpm 安装MySQL遇到以下问题: err ...

  3. Broken Keyboard (a.k.a. Beiju Text) UVA - 11988 (链表)

    题目链接:https://vjudge.net/problem/UVA-11988 题目大意:输入一个字符串,输出在原本应该是怎么样的?  具体方法是 碰到' [ ' 回到最前面  碰到‘ ]’  回 ...

  4. 8597 石子划分问题 dpdp,只考虑第一次即可

    8597 石子划分问题 时间限制:500MS  内存限制:1000K提交次数:155 通过次数:53 题型: 编程题   语言: G++;GCC;VC Description 给定n个石子,其重量分别 ...

  5. linux开机挂载磁盘

    1. [root@localhost master-build]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Thu Aug :: ...

  6. Kudu的配置(官网推荐的步骤)(Configuring Apache Kudu)

    不多说,直接上干货! http://kudu.apache.org/docs/configuration.html

  7. HDU 2121——Ice_cream’s world II——————【最小树形图、不定根】

    Ice_cream’s world II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  8. WebView加载页面,带链接的Img在页面第一次加载时无法显示的问题

    在做一个App的过程中,用到WebView来显示几个页面.在这个过程中发现有些页面的显示出现了异常:页面中的Img链接在页面第一次加载时无法正常显示图片,退出页面再次进入后可正常显示.开始以为是Web ...

  9. Spring课程 Spring入门篇 2-2 Spring注入方式

    课程链接: 本节主要讲了以下两块内容: 1 xml两种注入方式 2 注入方式代码实现 3 特别注意 1 xml两种注入方式 构造注入和set注入 2 注入方式代码实现 2.1 set注入方式的实现 实 ...

  10. JAVA ------ 大牛

    李学凯 :http://blog.csdn.net/qq_27093465/article/details/51750535 码农场:http://www.hankcs.com/program/ 徐刘 ...