Quartz存储与持久化-基于quartz.properties的配置
来源:互联网 发布:活性炭吸附甲醛 知乎 编辑:程序博客网 时间:2024/05/22 01:16
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
一、 Quartz存储与持久化
Quartz提供两种基本作业存储类型。第一种类型叫做RAMJobStore,第二种类型叫做JDBC作业存储。在默认情况下Quartz将任务调度的运行信息保存在内存中,这种方法提供了最佳的性能,因为内存中数据访问最快。不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失。
比如我们希望安排一个执行100次的任务,如果执行到50次时系统崩溃了,系统重启时任务的执行计数器将从0开始。在大多数实际的应用中,我们往往并不需要保存任务调度的现场数据,因为很少需要规划一个指定执行次数的任务。对于仅执行一次的任务来说,其执行条件信息本身应该是已经持久化的业务数据(如锁定到期解锁任务,解锁的时间应该是业务数据),当执行完成后,条件信息也会相应改变。当然调度现场信息不仅仅是记录运行次数,还包括调度规则、JobDataMap中的数据等等。
如果确实需要持久化任务调度信息,Quartz允许你通过调整其属性文件,将这些信息保存到数据库中。使用数据库保存任务调度信息后,即使系统崩溃后重新启动,任务的调度信息将得到恢复。如前面所说的例子,执行50次崩溃后重新运行,计数器将从51开始计数。使用了数据库保存信息的任务称为持久化任务。
对比
类型
优点
缺点
RAMJobStore
不要外部数据库,配置容易,运行速度快
因为调度程序信息是存储在被分配给JVM的内存里面,所以,当应用程序停止运行时,所有调度信息将被丢失。另外因为存储到JVM内存里面,所以可以存储多少个Job和Trigger将会受到限制
JDBC作业存储
支持集群,因为所有的任务信息都会保存到数据库中,可以控制事物,还有就是如果应用服务器关闭或者重启,任务信息都不会丢失,并且可以恢复因服务器关闭或者重启而导致执行失败的任务
运行速度的快慢取决与连接数据库的快慢
二、Quartz存储实例
下面开始说实现的步骤吧:
2.1、建立数据存储表
因为需要把quartz的数据保存到数据库,所以要建立相关的数据库。这个可以从下载到的quartz包里面找到对应的sql脚本,目前可以支持MySQL,DB2,Oracle等主流的数据库,自己可以根据项目需要选择合适的脚本运行。
我的项目是mysql的,就在数据中建立了一个quartz的database,然后执行tables_mysql_innodb.sql脚本建表。其中脚本 文件位于:E:\JarCom\quartz-2.2.1\docs\dbTables(根据你Quartz放置的目录会不同)
然后打开MySql的终端:
先建立一个数据库,名为quartz;
然后执行脚本:
运行结果:
首先会出现如下错误:
这里有四张数据表创建失败。
解决方法:
将tables_mysql_innodb.sql中的TYENGINEPE=InnoDB全部都替换成ENGINE=InnoDB;
再次执行:
表示数据库表创建成功了
表建立好后可以看到相关的table
+————————–+
| Tables_in_quartz |
+————————–+
| QRTZ_BLOB_TRIGGERS |
| QRTZ_CALENDARS |
| QRTZ_CRON_TRIGGERS |
| QRTZ_FIRED_TRIGGERS |
| QRTZ_JOB_DETAILS |
| QRTZ_LOCKS |
| QRTZ_PAUSED_TRIGGER_GRPS |
| QRTZ_SCHEDULER_STATE |
| QRTZ_SIMPLE_TRIGGERS |
| QRTZ_SIMPROP_TRIGGERS |
| QRTZ_TRIGGERS |
+————————–+
2.2、新建工程并导入包
新建一个Java工程,导入相关的jar包
这里我就不多说了,可以到官网上去下载,本文使用的是最新的2,2.1
quartz:http://www.quartz-scheduler.org/
及mySql操作的包,和一个commons-lang包,整个工作最终目录如下:然后,需要在项目中加上对应的配置。
2.3、首先是quartz.properties的配置
其中org.quartz.jobStore.class是指明quartz的持久化用数据库来保存,
而org.quartz.jobStore.driverDelegateClass是根据选择的数据库类型不同而不同,我这里的是mysql,所以是org.quartz.impl.jdbcjobstore.StdJDBCDelegate。
Quartz的属性配置文件主要包括三方面的信息:
1)集群信息;
2)调度器线程池;
3)任务调度现场数据的保存。
·调度器属性
第一部分有两行,分别设置调度器的实例名(instanceName) 和实例 ID (instanceId)。属性 org.quartz.scheduler.instanceName 可以是你喜欢的任何字符串。它用来在用到多个调度器区分特定的调度器实例。多个调度器通常用在集群环境中。现在的话,设置如下的一个字符串就行:org.quartz.scheduler.instanceName :DefaultQuartzScheduler实际上,这也是当你没有该属性配置时的默认值。
调度器的第二个属性是 org.quartz.scheduler.instanceId。和 instaneName 属性一样,instanceId 属性也允许任何字符串。这个值必须是在所有调度器实例中是唯一的,尤其是在一个集群当中。假如你想 Quartz 帮你生成这个值的话,可以设置为 AUTO。如果 Quartz 框架是运行在非集群环境中,那么自动产生的值将会是 NON_CLUSTERED。假如是在集群环境下使用 Quartz,这个值将会是主机名加上当前的日期和时间。大多情况下,设置为 AUTO 即可。
·线程池属性
接下来的部分是设置有关线程必要的属性值,这些线程在 Quartz 中是运行在后台担当重任的。threadCount 属性控制了多少个工作者线程被创建用来处理 Job。原则上是,要处理的 Job 越多,那么需要的工作者线程也就越多。threadCount 的数值至少为 1。Quartz 没有限定你设置工作者线程的最大值,但是在多数机器上设置该值超过100的话就会显得相当不实用了,特别是在你的 Job 执行时间较长的情况下。这项没有默认值,所以你必须为这个属性设定一个值。
threadPriority 属性设置工作者线程的优先级。优先级别高的线程比级别低的线程更优先得到执行。threadPriority 属性的最大值是常量 java.lang.Thread.MAX_PRIORITY,等于10。最小值为常量 java.lang.Thread.MIN_PRIORITY,为1。这个属性的正常值是 Thread.NORM_PRIORITY,为5。大多情况下,把它设置为5,这也是没指定该属性的默认值。
最后一个要设置的线程池属性是 org.quartz.threadPool.class。这个值是一个实现了 org.quartz.spi.ThreadPool 接口的类的全限名称。Quartz 自带的线程池实现类是 org.quartz.smpl.SimpleThreadPool,它能够满足大多数用户的需求。这个线程池实现具备简单的行为,并经很好的测试过。它在调度器的生命周期中提供固定大小的线程池。你能根据需求创建自己的线程池实现,如果你想要一个随需可伸缩的线程池时也许需要这么做。这个属性没有默认值,你必须为其指定值。
·作业存储设置
作业存储部分的设置描述了在调度器实例的生命周期中,Job 和 Trigger 信息是如何被存储的。我们还没有谈论到作业存储和它的目的;因为对当前例子是非必的,所以我们留待以后说明。现在的话,你所要了解的就是我们存储调度器信息在内存中而不是在关系型数据库中就行了。
把调度器信息存储在内存中非常的快也易于配置。当调度器进程一旦被终止,所有的 Job 和 Trigger 的状态就丢失了。要使 Job 存储在内存中需通过设置 org.quartz.jobStrore.class 属性为 org.quartz.simpl.RAMJobStore。假如我们不希望在 JVM 退出之后丢失调度器的状态信息的话,我们可以使用关系型数据库来存储这些信息。这需要另一个作业存储(JobStore) 实现,我们在后面将会讨论到。第五章“Cron Trigger 和其他”和第六章“作业存储和持久化”会提到你需要用到的不同类型的作业存储实现。2.4、创建Job类
2.5、创建Job的执行类:
2.6、执行:
然后打开数据库,输入
然后把上面的程序停了,点击右上角的红框框
把主代码改成:
输出结果:
同时,查找数据中的表:
发现有变化 了。。TRIGGER_GROUP表示的执行的次数,TRIGGER_GROUP表示被激发的次数
来回的不断停止程序再重新开始程序,结果如下。
重新停止再打开后,TRIGGER_GROUP变为39,他会减去上一次运行中TRIGGER_GROUP的次数,TRIGGER_GROUP每次运行都会从0开始计算
然后等100次执行完后,这个调度就会从数据表中删除:
结果如下:
这时,该表中的记录已经变空。
值得注意的是,如果你使用JDBC保存任务调度数据时,当你运行代码
然后退出,当再次希望运行
时,系统将抛出JobDetail重名的异常:Unable to store Job with name: 'job1_1' and group: 'jGroup1', because one already exists with this identification.因为每次调用Scheduler#scheduleJob()时,Quartz都会将JobDetail和Trigger的信息保存到数据库中,如果数据表中已经同名的JobDetail或Trigger,异常就产生了。
这里再次运行应该这样做:
三、一些说明
一些相关的意义:
配置quartz.properties文件:
- Quartz存储与持久化-基于quartz.properties的配置
- 【Quartz】Quartz存储与持久化-基于quartz.properties的配置
- 【Quartz】Quartz存储与持久化-基于quartz.properties的配置
- 【Quartz】Quartz存储与持久化-基于quartz.properties的配置
- 【Quartz】Quartz存储与持久化-基于quartz.properties的配置
- 【Quartz】Quartz存储与持久化-基于quartz.properties的配置
- 【Quartz】Quartz存储与持久化-基于Spring的配置
- 【Quartz】Quartz存储与持久化-基于Spring的配置
- Quartz存储与持久化-基于Spring的配置
- Quartz任务调度(3)存储与持久化操作配置详细解析
- Quartz任务调度(3)存储与持久化操作配置详细解析
- Quartz任务调度存储与持久化操作配置详细解析(1)
- quartz.properties配置
- quartz.properties配置
- quartz.properties配置
- 配置 quartz.properties 文件
- QUARTZ.properties配置
- Quartzs -- Quartz.properties 配置
- 玲珑杯round11-B:Niro loves Chinese
- Activity跳转后自动执行了onDestroy
- nRF51822 SPI 驱动 ADXL362
- 【图像特征提取11】SIFT算法的原理与C源码剖析
- 团体程序设计天梯赛-练习集 L2-013. 红色警报 解题报告
- Quartz存储与持久化-基于quartz.properties的配置
- 一种移动端布局方式随内容往下走的底部
- bzoj 2186: [Sdoi2008]沙拉公主的困惑 数论
- SQL SERVER 将表包括内容从一个数据库复制到另外一个数据库内
- CentOS6.5升级GCC4.8.2
- 使用docker时出现wlan网络适配器驱动程序出现问题
- mybatis在xml文件中处理大于号小于号的方法
- Eclipse 快捷键返回值
- 数据压缩原理与应用 实验一 彩色空间转换(YUVtoRGB)