APP下载

基于quartz的企业任务调度平台的设计与实现

2017-05-30胡茂集

科技尚品 2017年2期
关键词:任务调度调度规则

胡茂集

摘 要:本文在阐述quartz解释、技术要素和优势的基础上,探索在J2EE架构下使用quartz技术实现企业任务调度平台的途径。

关键词:quartz;企业任务调度平台

1 前言

随着大数据时代的来临以及商业应用地飞速发展,利用java API实现的传统离散的任务调度应用已无法满足企业在动态定制、工作效率以及统一、集中管控等方面提出的需求。企业任务调度平台(Enterprise task scheduling platform,以下称ETSP)正是在这样的背景下提出,该平台充分利用quartz开源框架功能强大,应用灵活,易于集成的特点,适应企业任务多而杂的现状,将企业中诸如消息发送、数据备份、挖掘、报表分析、数据采集、同步、迁移、加工等一系列任务集中管控,并让用户可根据需要定制个性化任务调度,有效监管任务调度运行,降低出错概率,提高运行效率,减轻企业IT人员的开发与维护工作。

2 Quartz任务调度的基本实现原理

传统离散的企业任务调度或使用Java SDK Timer和 TimerTask类,或使用Crontab+SQL来达到目的,这类任务调度使配置和代码分散在多处,难以维护和监控,执行过程没有保证,缺失错误恢复,在一些步骤复杂、分散,任务量大的情况下,很难进行扩展。这些局限恰恰是Quartz的优势。

Quartz完全基于Java实现。它有强大的调度功能,支持丰富多样的调度方法,并具有以下特点:具有强大容错及负载均衡能力,能被集成到任何独立的应用中,可在servlet容器或应用服务器中实例化,甚至成为独立程序为集群;程序员可通过RMI运用Quartz。

Quartz的核心三要素是trigger、job和scheduler,其中scheduler为执行调度的实际控制器,trigger、job是任务调度的元数据。trigger用于定义调度规则,即按照什么时间或周期去执行任务。一个job可被多个trigger关联,但是一个trigger只能关联一个job。Scheduler定义了很多接口和方法,它表示一个Quartz独立的运行容器,Trigger和JobDetail可以在Scheduler中被注册,并许可外程序部通过组及名称访问、控制容器中Trigger和JobDetail。

Quartz拥有完备的事件和事件监听体系,大部分组件都拥有触发后事件、调度器开始事件、关闭事件任务执行前事件、任务执行后事件、触发器触发前事件等等。

3 企业任务调度平台的设计与实现

3.1 平台功能设计

根据Quartz特性,企业任务调度系统包括这些模块:控制台、任务调度、工作管理、运行规则管理等,用户使用企业任务调度平台管控所有需要调度的任务,结合上文提到的scheduler与job的关联来理清任务与工作之间的关系,其中,一个任务包含N个工作,需要通过系统界面将N个工作进行工作编排,每个任务都基于一条运行规则按照工作编排的顺序执行。所以,要新建一个调度任务,必须经过以下步骤:

首先,在运行规则管理模块编排运行规则。经过规则测试成功之后再生成一条新的运行规则,如用户确定运行规则为“每1个月的第10个工作日,在0时0分0秒执行”,则规则编排器自动生成Quartz cron表达式“0 0 0 10W 1/1 ?”。用户可以选择该运行规则基于普通日历还是工作日历生成,如果基于工作日历生成,则在之后的调度任务配置功能里可以设置遇到企业非工作日或者假期是否顺延。工作日历的管理功能在工作管理模块中。

其次,在工作管理模块新建任务所需要执行的各项工作。每项工作生成一条新的工作项。这些工作项可以是企业其他系统提供的接口,也可以是一些用于数据处理的存储过程或者是用于数据加工的ETL(Extract-Transform-Load)工具提供的工作流。新建工作项时,需要配置该工作所属的工作组,工作组的概念是为了更好的管理各项工作,理清该工作属性,可以按照用途、类别或者系统界限区分,比如所有涉及存储过程的工作项归为一类、系统接口归为一类,或者涉及数据库处理的归为一类、程序执行归为另一类等。

最后,利用已新建的运行规则及所需工作项,可以选择N个工作项来编排一个调度任务,并设置该任务的出错处理、节假日处理等事项。

3.2 平台实现

对于一些复杂的企业级任务调度应用来说,建议在程序的开发阶段将整个Quartz的源代码复制至开发环境中。一方面可以通过修改或扩展Quartz一部分类来实现某些更为复杂的、Quartz本身尚不提供的接口功能;另一方面,通过阅读源码,我们可以迅速了解Quartz的实现原理,更加熟悉接下来的开发过程。下面我们通过创建数据关系与整合Quartz的方法来概述平台的实现逻辑。

Quartz依赖于一个关系型数据库管理系统(RDMS)来持久化存储。本平台使用JDBC来持久化Scheduler状态到数据库中。为了实现任务调度管控功能,在本平台中,首先引入Quartz数据库结构建立数据库。

在Quartz中,任务本身实际的运行时间和耗费在每个监听器上的时间都会直接记入到任务的执行时间上,使用大量的监听器,如JobListeners、SchedulerListeners或TriggerListeners会影响Quartz执行效率。再者,Quartz在与数据库交互方面本身实际上只做很少的处理,差不多所有的时间都花费在数据库上,因为基于JDBC的JobStore的速度很大程度上取决于对数据库连接的速度。所以,在本平台实施过程中,为提高平台性能,一是为Quartz表建立索引;二是避免创建大量全局监听器。

接下来,我们需要在项目中整合Quartz,具体做法为:将quartz.properties文件放置到classes目录下即可。至此,Quartz已经完整合到了企业任务调度平台项目中,并建立了任务调度数据库。接下来,我们需要利用Quartz框架的重要组件来实现任务调度功能,这些组件包括Trigger、Scheduler、Job、JobDetail,以及SchedulerContext和JobDataMap等,限于篇幅,我们不再一一累述。Quartz框架的jar包中有名为examples的文件夹,其中有很多个基础实例可供开发者参照。

4 结语

企业的调度任务规模越大、越复杂、越被频繁地执行,那么能从信息化、自动化中获益也越大。通过本文对Quartz特性、企业任务调度平台设计与实现的阐述,我们可以看出,更高的资源使用效率、伸缩性,更少的出错几率使得利用Quartz来实现企业任务调度平台是不二选择。

参考文献

[1]耿勇,薛胜军.J2EE應用中任务的动态调度[J].开发研究与设计技术,2007,(6):1589-1674.

[2]王崟,董志勇.基于Quartz的网管系统任务调度的实现[J].电脑开发与应用,2011,24(7):23-24.

(作者单位:同济大学软件学院)

猜你喜欢

任务调度调度规则
撑竿跳规则的制定
数独的规则和演变
《调度集中系统(CTC)/列车调度指挥系统(TDCS)维护手册》正式出版
一种基于负载均衡的Kubernetes调度改进算法
虚拟机实时迁移调度算法
基于改进NSGA-Ⅱ算法的协同制造任务调度研究
基于时间负载均衡蚁群算法的云任务调度优化
让规则不规则
TPP反腐败规则对我国的启示
云计算环境中任务调度策略