Quartz2.2.x官方文档2.2.X—第三章 9.Job存储

Quartz 教程


Table of Contents | ‹ Lesson 8 | Lesson 10 ›

课程 9: Job 存储

JobStore的责任是保存和追踪你给予调度程序的所有"工作数据": jobs, triggers, calendars, 等等. 为你的Quartz调度程序实例选择合适的JobStore是一个重要的步骤。幸运的是, 一旦你了解了它们的区别选择起来是很简单的。你可以在配置文件(或者对象)中指定你使用的调度程序,之后该配置会用来从SchedulerFactory获取你的调度程序实例。

不要在直接在你的代码中使用JobStore实例。出于某些原因,很多人这样做。JobStore是Quartz在后面使用的。你应该告诉Quartz你使用那个JobStore(通过配置告诉它),但是在你的代码你应该使用调度程序接口工作。

RAMJobStore

RAMJobStore是最简单使用的JobStore,它也是表现最佳的(在CPU时间方面)。RAMJobStore以显而易见的方式获得它的名字: 它将所有数据保存在RAM中。这就是它为什么速度很快和配置简单的原因。缺点是当你的应用程序关闭所有的调度信息都会丢失 - 这也就意味着RAMJobStore不能满足触任务和触发器的"non-volatility"设置。对于某些应用程序这是可以接受的 - 甚至是期望的行为,但是对于对于其他一些应用,这可能是灾难性的。

关于使用RAMJobStore (假设你使用的是StdSchedulerFactory) 只需要简单的指定类名 org.quartz.simpl.RAMJobStore作为 as the JobStore 类属性,你可以使用此来配置Quartz:

配置Quartz去使用RAMJobStore

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

你不需要担心其他配置。

JDBCJobStore

JDBCJobStore这个名字是恰如其分的 - 它通过JDBC将所有数据保存到数据库中。因此它的配置比RAMJobStore要复杂一些, 而且它也没那么快。不过,性能并不是十分糟糕,特别是如果你用主键上的索引构建数据库的表。在比较现代的机器上,并且有比较可靠的局域网环境(在调度程序和数据库之间),检索和更新一个触发索引的时间通常小于10毫秒。

JDBCJobStore可以与几乎任务数据库一同工作,它已经被广泛的应用于Oracle, PostgreSQL, MySQL, MS SQLServer, HSQLDB, 和 DB2. 要使用JDBCJobStore,你必须首先创建一组Quartz使用的数据库表。你可以在Quartz发行版的"docs/dbTables"目录下可以找到建表SQL脚本。如果你的数据库类型没有脚本,那就看一下现存的数据库,并以任何必要的方式修改你的DB。在这些脚本中需要注意,所有脚本开始都是以"QRTZ_"作为前缀的。(例如表“QRTZ_TRIGGERS”, 和“QRTZ_JOB_DETAIL”). 这个前缀实际上可以是你任何喜欢的东西,只要你告诉JDBCJobStore这个前缀是什么。(在你的Quartz属性中). 对于创建同一个数据库的多个调度程序实例的多个表集,使用前缀可能是有用的。

一旦你把表创建好,你在配置和启动JDBCJobStore之前你有一个重要的事情去做。你需要确定你的应用程序需要什么类型的事务。如果你不需要将调度命令(例如添加和删除触发器)去使用事务,接着你可以使用JobStoreTX 来管理你的JobStore事务。(这是通常的选择).

如果你需要Quartz和其他事务独立工作(J2EE应用程序), 接着可以使用 JobStoreCMT - 在这种情况下,Quartz会让应用服务器容器来关联事务。

最后一块问题是从JDBCJobStore中配置DataSource来连接你的数据库。在你的Quartz属性中数据源使用不同方法定义。一个方法是让Quartz创建关联和数据源 - 通过提供数据库的所有连接信息。另一种方式是让Quartz使用由Quartz内部运行的应用服务器管理的数据源 - 通过向JDBCJobStore提供数据源的JNDI名称。关于属性的详细信息,查看在"docs/config"文件夹下的示例配置文件。

在使用JDBCJobStore (假设你使用StdSchedulerFactory) 你首先需要设置你的Quartz的JobStore为 org.quartz.impl.jdbcjobstore.JobStoreTX 或 org.quartz.impl.jdbcjobstore.JobStoreCMT - 具体取决于你跟上面几段说明的选择。

配置Quartz使用JobStoreTx

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

接下来, 你需要选择为JobStore一个DriverDelegate来使用。DriverDelegate负责执行你指定数据库的任何JDBC工作。StdJDBCDelegate  使用"vanilla"JDBC代码(和SQL语句)来执行工作的委托。如果没有为你的数据库制作另一个委托,那么尝试使用这个委托 - 我们仅为数据库制作了特定的数据库代理,我们发现了StdJDBCDelegate问题(它的问题最多!)。其他委托可以在"org.quartz.impl.jdbcjobstore"包里找到,或者在它的子包中找到。其他委托包含DB2v6Delegate (for DB2 version 6 and earlier), HSQLDBDelegate (for HSQLDB), MSSQLDelegate (for Microsoft SQLServer), PostgreSQLDelegate (for PostgreSQL), WeblogicDelegate (for using JDBC drivers made by Weblogic), OracleDelegate (for using Oracle), 或者其他.

一旦你选择了你的代理,那么设置它的类名到JDBCJobStore来使用。

配值JDBCJobStore使用DriverDelegate

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

接下来, 你需要告知JobStore你使用的表前缀(上文所述discussed above)。

配值JDBCJobStore的表前缀

org.quartz.jobStore.tablePrefix = QRTZ_

最后,你需要设置JobStore使用那些数据源。命名的数据源也必须在Quartz属性中定义。因此,我们制定Quartz应该使用数据源名称“myDS”(这是在配置属性的其他地方定义的).

Configuring JDBCJobStore with the name of the DataSource to use

org.quartz.jobStore.dataSource = myDS
如果调度程序很忙(例如差不多总是执行与线程池大小相同的任务数量,接着你应该设置数据库的连接数为线程池数量+2.
"org.quartz.jobStore.useProperties"配置参数可以是指为"true" (默认false) 以指示JDBCJobStore的JobDataMaps所有值会是字符串,因此可以使用Key-value实行存储,而不是在BLOB以对象序列化方式存储。从长远来看,这更安全,为你你避免了将你的非字符串类序列化成BLOB的类版本问题。

TerracottaJobStore

TerracottaJobStore提供了一种缩放和鲁棒性的手段,而不使用数据库。这就意味着你的数据库能够不受Quartz的负载,能够将所有资源保存在应用的其他部分。

TerracottaJobStore能够使集群或者非集群,不论是那种情况下,在应用程序重启之间提供一个维持数据的存储介质,因为数据存储在Terracotta服务器。它的性能比使用数据库要快,例如使用JDBCJobStore (大概一个数量级), 但是相对于RAMJobStore要慢。

使用TerracottaJobStore (假设你使用StdSchedulerFactory) 只需要制定类名org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore作为你用来配置Quartz的JobStore的类属性,并添加一个额外的配置行来指定Terracotta服务位置:

配置Quartz使用TerracottaJobStore

org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore
org.quartz.jobStore.tcConfigUrl = localhost:9510

更多关于JobStore和Terracotta可以查看http://www.terracotta.org/quartz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值