JobStroe 的作用是保存所有你给 scheduler 的“工作数据”:Job、Trigger、Calendar 等等。为你的 Quartz Scheduler 实例选择合适的 JobStore 是很重要的一步。幸运的是,如果你明白了各个 JobStore 之间的不同,那么选择起来将会非常容易。声明使用哪个 JobStore 需要使用到属性文件,这个属性文件可以提供给 SchedulerFactory 用于创建 scheduler 实例。
不要在你的代码中直接使用 JobStore 对象。基于某些原因,有很多开发者会这么做。JobStore 在 Quartz 中应该是在幕后工作。你需要告诉 Quartz 使用那个 JobStore(通过配置文件),然后在你的代码中只使用 Scheduler 对象。
RAMJobStore
RAMJobStore 是使用上最简单的 JobStore,它也拥有最高的性能(从 CPU 时间来计算)。从 RAMJobStore 的名字来看:它将保存所有数据在 RAM 中。这也是为什么它最轻快并且配置最简单。但是缺点是,当你的应用结束或崩溃,那么所有的 scheduler 数据将会丢失——这意味着,RAMJobStore 不会遵守在 Job 和 Trigger 上的“non-volatility”设置。对有的应用程序来说,这是可接受的(甚至期望如此),但是对另一些应用程序来说,可能是个灾难。要使用 RAMJobStore(假设你正在使用 StdSchedulerFactory),只需简单的在 Quartz 配置文件中设置 JobStore 配置项的值为 org.quartz.simpl.RAMJobStore 即可:
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org . quartz . jobStore . class = org . quartz . simpl . RAMJobStore |
接下来,你不需要再考虑其它任何配置。
JDBCJobStore
JDBCJobStore 将所有的数据通过 JDBC 保存到数据库中。因此,配置上比 RAMJobStore 稍微复杂一些,它的速度也比较慢。然而,这个性能的落后并不是特别大,尤其是当你在创建数据库表的时候为主键创建了索引的情况下。如果一组机器组建的 LAN(在 scheduler 和数据库之间)条件不错,那么获取并更新触发 Trigger 整个过程一般不会超过 10 毫秒。JDBCJobStore 可以几乎跟任何数据库结合使用,包括 Oracle、 PostgreSQL、 MySQL、 MS SQLServer、 HSQLDB 和 DB2。要使用 JDBCJobStore,你必须先为 Quartz 创建一组数据库表。创建表的脚本在 Quartz 发布包的“docs/dbTables”目录下。如果脚本不适合你所使用的数据库类型,你可以根据需要自己修改脚本。有一点需要注意,在这些脚本中,所有的数据库表都有“QRTZ_”前缀(例如表“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”)。实际上,你可以使用你喜欢的任意前缀,只需要在 Quartz 属性文件中告诉 JDBCJobStroe 使用哪个前缀即可。如果你需要在同一个数据库中为多个 scheduler 实例使用不同的数据库表保存数据,那么使用不同的前缀将会非常有用。
一旦数据库表创建好,在使用 JDBCJobStore 之前,还需要做一个决定。你需要决定你的应用程序要使用哪种类型的事务机制。如果你不需要绑定你的 scheduler 命令(例如增加和删除 Trigger)到其它的事务,那么 JosStore 可以通过 JobStoreTX 管理事务(这也是最常用的选择)。
如果你需要 Quzrtz 协同其它事务一起工作(例如,在 Java EE 应用服务器中),那么你需要使用 JobStoreCMT——这样,Quartz 将会让应用程序服务器来管理事务。
最后一点是如何创建 DataSource,好让 JDBCJobStore 从你的数据库中获取连接。.DataSource 在 Quartz 属性文件中,有几种不同的配置方法。一种方式是让 Quartz 自己创建并管理 DataSource —— 这需要提供数据库的所有连接信息。另一种方式是让 Quartz 使用应用程序服务器提供的 DataSource —— 提供给 JobStore DataSource 的 JNDI 名称。详细的配置可以参考“docs/config” 目录下的配置文件。
要使用 JDBCJobStore(假设你正在使用 StdSchedulerFactory),首先需要设置 Quartz 配置项,让 JobStore 类的属性是 org.quartz.impl.jdbcjobstore.JobStoreTX 或 org.quartz.impl.jdbcjobstore.JobStoreCMT —— 具体选择哪个值取决于上面的描述。
配置 Quartz 使用 org.quartz.impl.jdbcjobstore.JobStoreTX:
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org . quartz . jobStore . class = org . quartz . impl . jdbcjobstore . JobStoreTX |
接下来,你需要设置 JogStore 使用的 DriverDelegate。DriverDelegate 的作用是为特定的数据库执行 JDBC 的工作。StdJDBCDelegate 使用标准 JDBC 代码(和 SQL 语句)来做这个工作,如果没有其它合适的 delegate 适用于你的数据库,那么你可以试试使用 StdJDBCDelegate。其它的 delegate 可以在 “org.quartz.impl.jdbcjobstore” 包,或者在它的子包中找到。其它 delegate 包括 DB2v6Delegate (DB2 版本 6 或早期版本)、 HSQLDBDelegate (HSQLDB)、MSSQLDelegate(Microsoft SQLServer)、PostgreSQLDelegate (PostgreSQL)、WeblogicDelegate(使用 Weblogic 创建的 JDBC 驱动)、 OracleDelegate (Oracle)、等等。
一旦选择好使用哪个 delegate,那么就可以在属性文件中设置它的类名。
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org . quartz . jobStore . driverDelegateClass = org . quartz . impl . jdbcjobstore . StdJDBCDelegate |
接下来,需要配置 JobStore 使用的数据库表前缀(前面讨论过):
org.quartz.jobStore.tablePrefix = QRTZ_
org . quartz . jobStore . tablePrefix = QRTZ_ |
最后,你需要设置使用哪个 DataSource。DataSource 名必须定义到 Quartz 属性文件中。在下面的例子中我们使用“myDS”作为 DataSource 名:
org.quartz.jobStore.dataSource = myDS
org . quartz . jobStore . dataSource = myDS |
如果你的 Scheduler 很繁忙(例如,执行的任务数和线程池的大小总是差不多),那么你可能要设置 DataSource 中的连接数是线程池中的大小 + 2。
可以设置 org.quartz.jobStore.useProperties 属性值为 true(默认是 false),目的是为了让 JDBCJobStore 中的 JobDataMap 中的所有值都是 String 类型,这样方便存储键值对,而不是使用序列化的方式将复杂的对象存储到 BLOB 字段中。在长期看来,这将会更安全,因为你避免了类的版本的问题。
TerracottaJobStore
TerracottaJobStore 提供了一种不使用数据库,并且灵活的和健壮的手段。这意味着你的数据库可以不用加载任何 Quartz 的数据,这样可以为你的应用程序节省更多的数据库资源。
TerracottaJobStore 可以在集群或非集群的环境下使用,无论哪种环境都会在应用程序重启的时候为 Job 数据提供储存介质。这些数据是存储在 Terracotta 服务器中。它的性能会比通过 JDBCJobStore 使用数据库更高,但是会低于使用 RAMJobStore。
要使用 TerracottaJobStore (假设你使用 StdSchedulerFactory),只需要简单的在属性文件中设置 org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore,并另起一行设置 Terracotta 服务器的位置:
org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore
org.quartz.jobStore.tcConfigUrl = localhost:9510
org . quartz . jobStore . class = org . terracotta . quartz . TerracottaJobStore org . quartz . jobStore . tcConfigUrl = localhost : 9510 |
相关推荐
石英-redis-jobstore 使用 JobStore。 该项目的灵感来自 ,并提供了相似的功能,但有一些主要区别: Redis数据库和密钥前缀是可配置的。 使用Redis。 该库涵盖了该库的所有功能。要求Java 7或更高版本Redis 2.6.12或...
这是一个quartz2.2+JobStore开发的持久化到数据库的程序。
NULL 博文链接:https://orange5458.iteye.com/blog/1171035
石英-elasticsearch-jobstore
# 主要分为scheduler、threadPool、jobStore、dataSource等部分 #============================================================== #Configure Main Scheduler Properties #=====================================...
NOTE: If "org.quartz.scheduler.batchTriggerAcquisitionMaxCount" is set to > 1, and JDBC JobStore is used, then "org.quartz.jobStore.acquireTriggersWithinLock" must be set to "true" to avoid data ...
基于JDBC-Jobstore的方式实现集群(有数据库JobStoreTX或JobStoreCMT) 二.TerracottaJobStore的配置(无数据库的集群) 本文介绍的是JDBC-Jobstore基于数据库的集群: 1.目前,群集仅适用于JDBC-Jobstore...
Quartz官方开发指南 1. 第一课:使用Quartz ...• 如何提高JDBC-JobStore的性能? • 如果数据服务器重新启动,DB连接不能够正确恢复 关于事务的问题 • 使用JobStoreCMT并且发现了死锁,该如何做?
Quertz中提供了两类触发器为:SimpleTrigger,CronTrigger。前者用于实现比较简单的定时功能,例如几点开始,几 点结束,隔多长时间执行,共执行多少...JobStore类:在哪里执行定进程序,可选的有在内存中,在数据库中。
内容提要:有关改善 JobStore 性能的讨论--主要是 JDBC JobStore;还有如何创建自定义的 JobStore--需实现 40 个接口方法。 第七章. 实现 Quartz 监听器 (第一部分) 内容提要:简单介绍了监听器是 Quartz 框架的一...
动力石英DynamoDB上的 实现使用实现足够好的SDK向后兼容性支持
postgres quatrz初始化sql...#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
本文介绍的是JDBC-Jobstore基于数据库的集群,里面已包含有详细的文档和继承案例,请各位技术追求者门笑纳
本文介绍的是JDBC-Jobstore基于数据库的集群,里面已包含有详细的文档和继承案例,请各位技术追求者门笑纳
quartz-simpledb-jobstore.zip,一个quartz作业存储实现,用于将作业详细信息和触发器持久化到amazon simpledb a quartz作业存储,以在amazon simpledb中持久化作业详细信息和触发器
simple-job-framework 项目介绍 本项目以尽量简洁的方式实现一个任务调度框架,演示一个任务调度框架所使用... + jobstore 任务/触发器信息 + thread 执行线程池 + executor 执行器 + factory 调度器工厂 + util +
一、关于 Quartz Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用...JobStore: 存储作业和调度期间的状态 Calendar:指定排除的时间点(如排除法定节假日) job Job 是一个接口,只有一个方法 voi
1、Quartz的设计包括一个JobStore接口,可以实现该接口以提供用于存储作业的各种机制。 2、通过使用随附的JDBCJobStore,所有配置为“非易失性”的作业和触发器都将通过JDBC存储在关系数据库中。 3、通过使用随附的...
quartz分布式例子代码 直接导入Eclipse工程即可运行。