没有合适的资源?快使用搜索试试~ 我知道了~
首页利用Quartz实现任务调度的集群
资源详情
资源评论
资源推荐

软件体系最佳实践文档
最佳实践:利用
实现任务调度的集群
分类:
作者:凡彬勇
日期:
导读: 集群的实现
1. 任务调度为什么要实现集群
公众企业应用几乎都会碰到任务调度的需求,任务调度本身涉及到多线程并
发、运行时间规则制定和解析、场景保持与恢复、线程池维护等诸多方面的工
作。如果直接使用自定义线程这种刀耕火种的原始办法,开发任务调度程序是
一项颇具挑战性的工作。 开源的好处就是:领域问题都能找到现成的解决
方案。
所提供的 自 年发布版本以来已经被众多项
目作为任务调度的解决方案, 在提供巨大灵活性的同时并未牺牲其简单
性,它所提供的强大功能使你可以应付绝大多数的调度需求。在开源
任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它同时保
持了使用的简单性。允许开发人员灵活地定义触发器的调度时间表,
并可以对触发器和任务进行关联映射。此外, 提供了调度运行环境的持
久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数
据并不会丢失。此外, 还提供了组件式的侦听器、各种插件、线程池等
功能。
2. quartz 集群的原理
一个 集群中的每个节点是一个独立的 应用,它又管理着
其他的节点。意思是你必须对每个节点分别启动或停止。不像许多应用服务器
第 页 共 页

软件体系最佳实践文档
的集群,独立的 节点并不与另一其的节点或是管理节点通信。
应用是通过数据库表来感知到另一应用的。
图:表示了每个节点直接与数据库通信,若离开数据库将对其他节点一无所知
集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。
目前集群只能工作在 !或者 " #方式
下,从本质上来说,是使集群上的每一个节点通过共享同一个数据库来工作的
( 通过启动两个维护线程来维护数据库状态实现集群管理,一个是检测
节点状态线程,一个是恢复任务线程)。负载平衡是自动完成的,集群的每个
节点会尽快触发任务。当一个触发器的触发时间到达时,第一个节点将会获得
任务(通过锁定),成为执行任务的节点。故障切换的发生是在当一个节点正
在执行一个或者多个任务失败的时候。当一个节点失败了,其他的节点会检测
到并且标识在失败节点上正在进行的数据库中的任务。任何被标记为可恢复
(任务详细信息的$%&$属性)的任务都会被其他的节点重新
执行。没有标记可恢复的任务只会被释放出来,将会在下次相关触发器触发时
执行
3. quartz 集群步骤
3.1. 创建 Quartz 数据库表
因为 集群依赖于数据库,所以必须首先创建 数据库表。
包 括 了 所 有 被 支 持 的 数 据 库 平 台 的 ' 脚 本 。 在
(%)*+,&+, -目录下找到那些 '脚本,这里的
第 页 共 页

软件体系最佳实践文档
(%)*是解压 分发包后的目录。
这里采用的 ./.0 版本,总共 张表,不同版本,表个数可能不
同。数据库为 &-,用 -)&-.%- 创建数据库表。
3.2. 配置数据库连接池 ,这里使用 Spring+C3p0
在 系 统 的 全 局 配 置 文 件 中 新 增 如 下 信 息 , 我 这 里 的 全 局 配 置 文 件 是 :
&12.3
db.dialect=org.hibernate.dialect.Oracle9Dialect
db.driverClassName=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:@127.0.0.1:1521:feelview
db.username=feelviewdata
db.password=paic1234
TescronExpression1=0 0/1 * ? * *
其中: &453 是定时器的 & 表达式(我这里配置的是每
分 钟 跑 一 次 ) , 下 面 在 配 置 322 的 时 候 会 使 用 到 。 关 于
& 表达式的配置这里不做介绍,在 % 的官方文档有详细介绍
<!—全局配置文件读入 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderCo
nfigurer">
<property name="locations">
<list>
<value>classpath:config.properties</value>
</list>
</property>
</bean>
<!—连接池配置-->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-
method="close">
<property name="driverClass" value="${db.driverClassName}">
第 6 页 共 页
剩余10页未读,继续阅读















安全验证
文档复制为VIP权益,开通VIP直接复制

评论2