三. 配置 Quartz 使用集群
为 Quartz 配置集群环境的步骤比设置类似的 J2EE 集群环境容易的多:
1. 配置每个节点的 quartz.properties 文件。
2. 配置 JDBC JobStore。
3. 使用 Scheduler 信息(Job 和 Trigger) 装载数据库。
4. 启动每个 Quartz 节点。
·配置节点的 quartz.properties 文件
就像是运行 Quartz 在非集群环境中那样,每个 Quartz 应用需要一个 quartz.properties 文件。在第三章,“Hello, Quartz” 中提到过,假如你不指定它,会使用默认的 quartz.properties 文件(存在于 quartz.jar 文件中)。最好是指定这个文件,因为你终究是需求修改一个或多个的设置项。
当使用 Quartz 的集群特性,你需要为每个节点修改 quartz.properties 文件。代码 11.1 显示了一个用于集群实例的 quartz.properties 文件的例子。属性将在之后讨论。
代码 11.1. 集群实例的 quartz.properties 文件示例
- #==============================================================
- #Configure Main Scheduler Properties
- #==============================================================
- org.quartz.scheduler.instanceName = TestScheduler1
- org.quartz.scheduler.instanceId = instance_one
- #==============================================================
- #Configure ThreadPool
- #==============================================================
- org.quartz.threadPool.class = org.quartz.simpl.Simple ThreadPool
- org.quartz.threadPool.threadCount = 5
- org.quartz.threadPool.threadPriority = 5
- #==============================================================
- #Configure JobStore
- #==============================================================
- org.quartz.jobStore.misfireThreshold = 60000
- org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
- org.quartz.jobStore.driverDelegateClass =
- org.quartz.impl.jdbcjobstore.MSSQLDelegate
- org.quartz.jobStore.tablePrefix = QRTZ_
- org.quartz.jobStore.dataSource = myDS
- org.quartz.jobStore.isClustered = true
- org.quartz.jobStore.clusterCheckinInterval = 20000
- #==============================================================
- #Non-Managed Configure Datasource
- #==============================================================
- org.quartz.dataSource.myDS.driver = net.sourceforge.jtds.jdbc.Driver
- org.quartz.dataSource.myDS.URL = jdbc:jtds:sqlserver://localhost:1433/quartz
- org.quartz.dataSource.myDS.user = admin
- org.quartz.dataSource.myDS.password = admin
- org.quartz.dataSource.myDS.maxConnections = 10
#============================================================== #Configure Main Scheduler Properties #============================================================== org.quartz.scheduler.instanceName = TestScheduler1 org.quartz.scheduler.instanceId = instance_one #============================================================== #Configure ThreadPool #============================================================== org.quartz.threadPool.class = org.quartz.simpl.Simple ThreadPool org.quartz.threadPool.threadCount = 5 org.quartz.threadPool.threadPriority = 5 #============================================================== #Configure JobStore #============================================================== org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.MSSQLDelegate org.quartz.jobStore.tablePrefix = QRTZ_ org.quartz.jobStore.dataSource = myDS org.quartz.jobStore.isClustered = true org.quartz.jobStore.clusterCheckinInterval = 20000 #============================================================== #Non-Managed Configure Datasource #============================================================== org.quartz.dataSource.myDS.driver = net.sourceforge.jtds.jdbc.Driver org.quartz.dataSource.myDS.URL = jdbc:jtds:sqlserver://localhost:1433/quartz org.quartz.dataSource.myDS.user = admin org.quartz.dataSource.myDS.password = admin org.quartz.dataSource.myDS.maxConnections = 10
·配置主要的 Scheduler 属性
在这一节中有两个属性应该配置
·org.quartz.scheduler.instanceName
·org.quartz.scheduler.instanceId
这两属性用于多处,用在 JDBC JobStore 中和数据库来唯一标识实例。
集群时为实例 ID 使用 AUTO AUTO 为专门为集群准备的。不幸的是,在某些早期的版本,1.4.5 版所用的机制任何情况下都不会清理旧的实例 ID。1.5.1 版中有一些插入式的实例 ID 生成器,其中一个是基于节点的 IP 地址来生成 ID;只要你在一台给定的机器上仅有一个 Quartz 集群节点时这个生成器工作的很好。集群时应当使用 AUTO,因为很多人把 Quartz 放在 EAR 中,分布部署在集群的应用服务器上。这时候,EAR 中必然只有一个 quartz.properties 文件,因此它在所有的节点上是相同的。假如实例 ID 是硬编码的,Quartz 集群将不能正常工作,因为所有的节点有着一样的 ID。AUTO 就是为解决这个问题的。 一些其他严重的集群问题在 Quartz 1.5.1 被引入。如果你需要对 Quartz 集群,你或许该避免这个版本。 |
·配置 JobStore 块
为使用 Quartz 的集群,你需要用到 JobStoreTX 或者 JobStoreCMT 作为 Scheduler 的 JobStore。第六章,“Job 存储和持久化” 详细说明了如何设置和使用所提供的这两个 JDBC JobStore。从代码 11.1 中,你能发现和第六章所显示的设置是一样的,还有两个附加的属性:
·org.quartz.jobStore.isClustered
·org.quartz.jobStore.clusterChedkinInterval
通过设置 org.quartz.jobStore.isClustered 属性为 true,你就告诉了 Scheduler 实例要它参与到一个集群当中。这一属性会贯穿于调度框架的始终,用于修改集群环境中操作的默认行为。
org.quartz.jobStore.clusterCheckinInterval 属性定义了Scheduler 实例检入到数据库中的频率(毫秒为单位)。Scheduler 检查是否其他的实例到了它们应当检入的时候未检入;这能指出一个失败的 Scheduler 实例,且当前 Scheduler 会以此来接管任何执行失败并可恢复的 Job。通过检入操作,Scheduler 也会更新自身的状态记录。
clusterChedkinInterval 越小,Scheduler 节点检查失败的 Scheduler 实例就越频繁。默认值是 15000 (即15 秒)。