您的位置:首页 > 其它

Job 存储和持久化 (第三部分)

2017-02-16 16:40 190 查看
七. 使用 JobStoreTX
我们首先要讨论的持久性 JobStore 是 JobStoreTX。名字中的 "TX" 代表着 "事物"。我们在前面提过,JobStoreTX 是设计用于想要 Quartz 来管理事物的环境中。例如,假如你正构建一个 J2EE 应用,并且不使用到应用服务器,如 WebLogic 或者 JBoss 等,那么 JobStoreTX 会是持久性 JobStore 正确的选择。
在之前章节中,我们看到配置 RAMJobStore 是多么的容易。我们提到 RAMJobStore 的其中一个优点就是易于配置。我们已经讨论过让数据库准备就绪该做的事情;现在我们讲述使 Quartz 应用支持 JDBC JobStore 需要对它配置些什么。
·配置 JobStoreTX
要告诉 Quartz 运行环境你想使用一个别的 JobStore 而不是默认的 RAMJobStore,你必须配置几个属性。配置它们的顺序无关紧要,只要保证在第一次运行程序之前都做了设置。
设置 JobStore 属性
欲告知 Scheduler 应该使用 JobStoreTX,你必须加上下面一行到 quartz.properties 文件中:
org.quartz.jobStore.class = org.quartz.ompl.jdbcjobstore.JobStoreTX
在切换到 JobStoreTX 时确保移动了 RAMJobStore 行(假如存在)。
配置驱动代理
JDBC API 依赖于专属于某个数据库平台的 JDBC 驱动,同样的,Quartz 依赖于某个 DriverDelegate 来与给定数据库进行通信。顾名思义,从 Scheduler 通过 JobStore 对数据库的调用是委托给一个预配置的 DriverDelegate 实例。这个代理承担起所有与 JDBC driver 也就是数据库的通信。
所有的 DriverDelegate 类都继承自 org.quartz.impl.jdbcjobstore.StdDriverDelegate 类。StdDriverDelegte 只有所有代理可用的,平台无关性的基本功能。然而,在不同的数据库平台间还是存在太多的差异,因此需要为某个平台创建特定的代理。表 6.2 列出特定的代理。
表 6.2. 你必须为你的平台配置其中一个 DriverDelegate
数据库平台
Quartz 代理类Cloudscape/Derby
org.quartz.impl.jdbcjobstore.CloudscapeDelegateDB2 (version 6.x)
org.quartz.impl.jdbcjobstore.DB2v6DelegateDB2 (version 7.x)
org.quartz.impl.jdbcjobstore.DB2v7DelegateDB2 (version 8.x)
org.quartz.impl.jdbcjobstore.DB2v8DelegateHSQLDB
org.quartz.impl.jdbcjobstore.PostgreSQLDelegateMS SQL Server
org.quartz.impl.jdbcjobstore.MSSQLDelegatePointbase
org.quartz.impl.jdbcjobstore.PointbaseDelegatePostgreSQL
org.quartz.impl.jdbcjobstore.PostgreSQLDelegate(WebLogic JDBC Driver)
org.quartz.impl.jdbcjobstore.WebLogicDelegate(WebLogic 8.1 with Oracle)
org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegateOracle
org.quartz.impl.jdbcjobstore.oracle.OracleDelegate假如我的数据库平台在表 6.2 中未列出该怎么办
如果你的 RDBMS 没在上面列出,那么最好的选择就是,直接使用标准的 JDBC 代理 org.quartz.impl.jdbcjobstore.StdDriverDelegate 就能正常的工作。在你决定好了基于你的数据库平台使用哪个代理,你就需要加入下面的行到 quartz.properties 文件中:
org.quartz.jobStore.driverDelegateClass = <FQN of driver delegate class>
例如,假如你使用 MS SQL Server 作为一你的数据库平台,你就需要加下面这行到属性文件中:
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.MSSQLDelegate
配置数据库表的前缀
前面我们首先讨论 Quartz 要用的数据库表的时候,我们提到所有的表都加有一个前缀 QRTZ_。在某些情况下,你也许需要创建多套的 Quartz 数据库表。在这时候,你就需要改变每一套表的前缀。
表名的前缀配置在 quartz.properties 文件中,使用属性 org.quartz.jobStore.tablePrefix。要改变这一前缀,只要设置这个属性为不同的值:
org.quartz.jobStore.tablePrefix = SCHEDULER2_
确定所有的表名都开始于这一前缀。数据库表和列的命名
假使你还有所疑惑,数据库表的名字(除却前缀) 和表的列名定义在 org.quartz.impl.jdbcjobstore.Constants 接口中。这个接口为 JobStoreSupport 类所实现,因而那些常量值在 JobStoreTX 或 JobStoreCMT 类中是可用的。表 6.3 显示了一系列的属性可用于调节 JobStoreTX。
表 6.3. 可用于设置 JobStoreTX 的配置属性
属性
默认值org.quartz.jobStore.driverDelegateClass描述:能理解不同数据库系统中某一特定方言的驱动代理org.quartz.jobStore.dataSource描述:用于 quartz.properties 中数据源的名称org.quartz.jobStore.tablePrefix
QRTZ_描述:指定用于 Scheduler 的一套数据库表名的前缀。假如有不同的前缀,Scheduler 就能在同一数据库中使用不同的表。org.quartz.jobStore.userProperties
False描述:"use properties" 标记指示着持久性 JobStore 所有在 JobDataMap 中的值都是字符串,因此能以 名-值 对的形式存储,而不用让更复杂的对象以序列化的形式存入 BLOB 列中。这样会更方便,因为让你避免了发生于序列化你的非字符串的类到 BLOB 时的有关类版本的问题。org.quartz.jobStore.misfireThreshold
60000描述:在 Trigger 被认为是错过触发之前,Scheduler 还容许 Trigger 通过它的下次触发时间的毫秒数(译者注:据原文翻译,真的不好理解,实际效果可参看:http://www.blogjava.net/Unmi/archive/2007/10/23/153413.html 我在评论中的实验)。默认值(假如你未在配置中存在这一属性条目) 是 60000(60 秒)。这个不仅限于 JDBC-JobStore;它也可作为 RAMJobStore 的参数org.quartz.jobStore.isClustered
False描述:设置为 true 打开集群特性。如果你有多个 Quartz 实例在用同一套数据库时,这个属性就必须设置为 true。org.quartz.jobStore.clusterCheckinInterval
15000描述:设置一个频度(毫秒),用于实例报告给集群中的其他实例。这会影响到侦测失败实例的敏捷度。它只用于设置了 isClustered 为 true 的时候。org.quartz.jobStore.maxMisfiresToHandleAtATime
20描述:这是 JobStore 能处理的错过触发的 Trigger 的最大数量。处理太多(超过两打) 很快会导致数据库表被锁定够长的时间,这样就妨碍了触发别的(还未错过触发) trigger 执行的性能。org.quartz.jobStore.dontSetAutoCommitFalse
False描述:设置这个参数为 true 会告诉 Quartz 从数据源获取的连接后不要调用它的 setAutoCommit(false) 方法。这在少些情况下是有帮助的,比如假如你有这样一个驱动,它会抱怨本来就是关闭的又来调用这个方法。这个属性默认值是 false,因为大多数的驱动都要求调用 setAutoCommit(false)。org.quartz.jobStore.selectWithLockSQL
SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE描述:这必须是一个从 LOCKS 表查询一行并对这行记录加锁的 SQL 语句。假如未设置,默认值就是 SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE,这能在大部分数据库上工作。{0} 会在运行期间被前面你配置的 TABLE_PREFIX 所替换。org.quartz.jobStore.txIsolationLevelSerializable
False描述:值为 true 时告知 Quartz(当使用 JobStoreTX 或 CMT) 调用 JDBC 连接的 setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE) 方法。这有助于阻止某些数据库在高负载和长时间事物时锁的超时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: