基于Quartz的集团化调度任务分布部署研究

时间:2022-02-26 05:59:06

基于Quartz的集团化调度任务分布部署研究

摘 要: 集团化应用系统中定时任务需要处理的数据量大、任务数量多,为即时快速对所有数据进行处理,需要将任务进行分布部署运行。通过对Quartz调度框架和集群分布部署技术的分析和研究,提出了集团化应用系统任务调度基于Quartz的集群分布部署方案,通过将Quartz和Spring集成并对Quartz调度任务容器进行扩展,在MemCache上进行服务器状态的更新,解决了大型应用系统定时任务的分布运行、故障处理问题。

关键字: Quartz; 任务调度; 集群; 分布部署

中图分类号: TN911?34; TP393 文献标识码: A 文章编号: 1004?373X(2014)02?0080?04

0 引 言

各类应用系统中,都存在着多种类型的定时调度任务,自动进行业务和系统功能的处理,如报表统计、流程流转、系统消息发送、系统运行监控、静态文件生成等。目前大型集团化企业应用系统在向统一规划、统一设计、统一开发、统一部署的大集中式云应用方向发展,通过统一的应用系统有利于进行集团内各分公司、下属单位业务的统一,有效利用硬件资源,通过集群提高系统的可靠性。这类应用系统中的定时任务需处理的数据量较大、任务运行时间长,为了提高数据处理的效率,可能需要将同一任务根据数据来源、类型分成多个任务同时进行处理,在单个服务器上运行大量任务,系统的可靠性不能满足,需要能将任务在多个集群服务器上进行分布部署运行。

JDK中的Timer、ScheduledExecutor是Java中实现定时调度任务的基础方法,但由于其功能较为简单,较难实现复杂的任务调度运行规则,在实际的应用开发中更多使用开源调度框架,如Quartz,Cron4j,JCronTab等,其中Quartz与Spring可以方便的集成,功能丰富,使用最为广泛。但其运行规则配置为代码级别,集群方式不能进行任务的指定服务器分布,不便于任务的运行管理,需要对其进行扩展。

1 Quartz调度框架

Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。Quartz 为在 Java 应用程序中进行任务调度提供了简单却强大的机制,支持从小型独立应用到大型企业级系统的各种类型Java应用。

1.1 Quartz基本概念

Quartz调度框架中核心元素包括Schedule,Job和Trigger。

Job用于表示被调度的任务,是定时执行的实际业务处理过程[2]。Quartz提供一个单方法的接口支持业务任务的实现。主要有两种类型的Job:无状态的(Stateless)和有状态的(Stateful)。有状态的Job不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。

Trigger是用于定义任务调度触发条件,即按照什么时间规则去执行任务。Quartz中主要提供了四种类型的Trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger和NthIncludedDayTrigger。这四种Trigger可以满足企业应用中的绝大部分需求,最长用的是CronTrigger,可以通过Cron表达式进行调度的年、月、日、星期、时、分、秒及循环间隔的定义。Job必须关联到Trigger上才能运行,一个Job可以被多个Trigger关联,但是一个Trigger只能关联一个Job。

Scheduler任务调度器是Quartz的核心,是调度任务的容器和管理器,Job和Trigger都需要注册到Schedule上。Schedule负责任务调度器的初始化,进行任务的启动、停止及任务数据、事件的管理。

1.2 Quartz与Spring基础使用介绍

在J2EE系统中,Quartz可以与Spring方便的进行集成,Job由Spring统一进行关联,可以方便地在Job中注入相关业务bean,并由Spring进行调度容器的初始化、加载全部Job和Trigger并启动运行[3]。

Quartz和Spring基础集成使用过程如下:

(1)通过Quartz的Job接口实现定时任务的业务功能,可引用Spring已定义的其他bean。

(2)在Spring applicationContext.xml中配置任务Bean,通过jobDataAsMap属性为任务注入业务bean,样例代码如下:

//注入业务bean

(3)在Spring applicationContext.xml中配置任务运行的调度规则,样例代码如下:

//关联定时任务bean

(4)在Spring applicationContext.xml中配置调度任务容器,样例代码如下:

//调度规则注册到容器

按照以上步骤配置后,启动中间件服务器,Spring会自动加载配置文件中已注册的任务进行调度运行。根据以上配置过程可见,要添加、修改任务运行的调度规则,必须修改XML配置文件,需要重新启动服务器才能生效,且不能配置同一任务在多个服务器分布运行,不适合实际应用系统的使用,因此需要对Quartz功能进行扩展,增强其集群分布运行能力,提高其可维护性。

2 集群分布部署

集群技术(Cluster技术)就是将多台服务器用集群软件连接在一起,组成一个高度透明的大型服务器群的计算机系统,作为一个整体为客户端提供服务,客户端能共享网络上的所有资源,如数据或应用软件等,同时客户端的用户并不关心其应用Server运行在那台服务器上,只关心其应用Server是否能连续工作。当集群系统内某一台服务器出现故障时,其备援服务器便立即接管该故障服务器的应用服务,继续为前端的用户提供服务。按照集群的部署情况可分为垂直集群和水平集群,垂直集群是在一台服务器上部署多台服务器,充分利用硬件资源。水平集群是利用多台机器资源,每台机器部署相同的应用。采用集群部署的目标有:

(1) 提高性能

一些计算密集型应用,需要计算机有很强的运算处理能力,现有的技术,即使普通的大型机其计算也很难胜任[4]。这时,一般都使用计算机集群技术,集中几十台甚至上百台计算机的运算能力来满足要求。提高处理性能一直是集群技术研究的一个重要目标之一。

(2) 降低成本

通常一套较好的集群配置,其软硬件开销要超过100 000美元。但与价值上百万美元的专用超级计算机相比已属相当便宜。在达到同样性能的条件下,采用计算机集群比采用同等运算能力的大型计算机具有更高的性价比。

(3) 提高可扩展性

用户若想扩展系统能力,不得不购买更高性能的服务器,才能获得额外所需的CPU 和存储器[5]。如果采用集群技术,则只需要将新的服务器加入集群中即可,对于客户来看,服务无论从连续性还是性能上都几乎没有变化,好像系统在不知不觉中完成了升级。

(4) 增强可靠性

集群技术使系统在故障发生时仍可以继续工作,将系统停运时间减到最小。集群系统在提高系统的可靠性的同时,也大大减小了故障损失。

3 基于Quartz的任务调度集群部署

3.1 Quartz扩展架构

根据前面的分析,要基于Quartz实现调度任务的集群分布部署,主要是要实现对任务调度规则Trigger在关系型数据库中的配置,及调度管理器的扩展,将定时任务根据配置分配到多个服务器上运行[6]。同时对Quartz的任务接口进行扩展,增强Job通用功能,实现调度器运行状态监测、调度故障转移两个默认的定时任务,负责保证任务运行的可靠性[7]。

为了在多个服务器间共享调度器运行状态信息,调度器运行状态监测任务将各服务器中启动的调度器状态定时更新到MemCache缓存服务器上。整体扩展架构如图1所示。

数据层负责调度任务运行相关数据的存储,关系型数据库中存储调度运行规则Trigger的配置信息,MemeCache缓存中存储各调度服务器的运行状态及各调度任务实际运行的IP地址。

基础层是对Quartz基本元素Job扩展和对Trigger的配置功能,并在Job的扩展基础上实现两个基础定时任务:调度器状态监测和调度故障转接,为调度器管理集群分布的调度任务提供基础服务支持。对Job的扩展主要是增加任务运行状态校验、运行日志记录、运行容错处理功能,业务调度任务就基于此扩展Job进行实现,可将任务的通用功能和实际业务功能进行分离。同时提供两个进行集群分布任务管理的内置任务实现,对任务运行的状态进行监控,实现服务异常后的任务转接运行。为支持Trigger的可视化配置,提供一套任务运行规则配置功能,为Trigger分配Job任务,配置Job运行的日期、时间、定时间隔、运行IP地址、端口及运行参数,同一个调度规则允许分配到多台服务器同时运行。配置信息存储到数据库中,简化了用户的配置难度,并支持运行中的规则修改,由调度管理器根据配置信息进行Trigger的启动,对IP、端口的配置不仅支持调度的水平集群部署,也支持调度的垂直集群部署。

管理层是调度任务集群分布部署的核心控制层,是对Schedule调度容器的控制扩展,定制Scheduler容器的初始化,根据数据库中调度运行规则的配置,自动生成cron表达式,按照调度规则中的运行服务器IP、端口配置,启动本服务器上应运行的任务规则,实现定时任务的集群分布运行。在启动任务时将该任务运行规则的运行参数、任务运行服务器的IP、端口等信息添加到任务的运行数据中。

3.2 核心任务功能说明

定时任务在集群服务器上分布运行后,需要对调度器的运行状态、各任务的运行状态进行跟踪,如发现调度异常,则对异常的任务转移到备份服务器上进行运行。这一可靠性保障就是通过调度器状态监测和调度故障转接两个核心任务来实现。

调度器状态监测任务定时将本服务器调度运行状态在MemCache上进行更新,本任务为内置任务,与调度器进行捆绑,调度器运行即启动状态监测任务。

调度故障转接任务定时对MemCache上各调度器的运行状态进行判断,若发现某调度器状态超期未进行更新,则根据调度规则配置,将安排在该服务器上运行的任务全部转接到本服务器上进行运行,故障服务器正常运行后,转接服务器上已转接的任务进行停止。

3.3 分布部署结构

通过图1的Quartz扩展架构可见集群分布部署时除业务任务进行分布外,还涉及到Schedule调度器、两个内置调度任务、Trigger配置功能需要进行部署才能调度任务进行运行,整体部署结构如图2所示。

4 结 论

本文通过对Quartz调度框架核心元素、集群分布部署的特点分析,及Quartz与Spring集成进行应用的过程分析,明确出了调度任务要在集群上分布部署的关键扩展方向,提出了对Quartz扩展的架构,并详细说明了对Job、Trigger、Schedule的扩展内容,最后给出了在集群环境下Quartz调度任务的分布部署结构,为集团化企业应用系统的调度任务集群分布部署提供了实现案例参考。

参考文献

[1] 郑雪松,谭红杨.Java作业调度应用实例分析[J].电脑知识与技术,2007,3(17):1348?1349.

[2] 胡利强,周冬初,王伟.Quartz调度器与Web程序整合的研究和应用[J].计算机与现代化,2010(8):95?99.

[3] 丁振凡,李馨梅.Spring的任务定时调度方法的研究比较[J].智能计算机与应用,2012,2(4):55?57.

[4] 饶浩,谢玄亮,林育东.支持集群部署的企业MIS系统架构分析与构建[J].现代制造工程,2010(9):22?25.

[5] 饶浩,谢玄亮.面向服务的企业信息系统集群部署方案[J].中国管理信息化,2009,12(14):81?82.

[6] 胡启敏,薛锦云,钟林辉.基于Spring框架的轻量级J2EE架构与应用[J].计算机工程与应用,2008,44(5):115?118.

[7] 张宇,王映辉,张翔南.基于Spring的MVC框架设计与实现[J].计算机工程,2010,36(4):59?62.

[8] 王波.ERP系统中邮件提醒定时器框架的设计与应用[J].现代电子技术,2012,35(6):25?27.

上一篇:一种基于自组织竞争网络的车辆识别方法 下一篇:电力企业客户细分模型研究