一种批处理任务调度方法及装置技术领域
本申请涉及软件领域,特别涉及一种批处理任务调度方法及装置。
背景技术
在现代企业应用当中,面对复杂的业务以及海量的数据,除了通过庞杂的人机交
互界面进行各种处理外,还有一种处理方式,即批处理,批处理不需要人工干预,只需要定
期读入大批量数据,然后完成相应业务处理并进行归档。
批处理方式作为现代企业应用当中不可或缺的数据处理方式,如何高效的执行批
处理任务成为问题。
发明内容
为解决上述技术问题,本申请实施例提供一种批处理任务调度方法及装置,以达
到提高调度执行批处理任务的效率的目的,技术方案如下:
一种批处理任务调度方法,应用于任务调度框架Quartz服务器,所述方法包括:
扫描登记记录表,将所述登记记录表中的每条定义分别生成任务调度标识,所述
登记记录表中的每条定义包括批处理任务逻辑的索引、执行任务类型、任务执行周期或频
率;
将生成的各个任务调度标识注册到批处理框架Spring Batch的任务仓库中,以建
立各个所述任务调度标识与所述批处理框架Spring Batch的任务仓库中批处理任务逻辑
的对应关系;
按照各个所述任务调度标识对应的任务执行频率或周期,调度执行所述批处理框
架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理任务逻辑。
优选的,在所述任务调度标识对应的批处理任务逻辑为周期性的批处理任务逻辑
的情况下,按照各个所述任务调度标识对应的任务执行频率或周期,调度执行所述批处理
框架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理任务逻辑之后,还包
括:
生成所述周期性的批处理任务逻辑的下一次执行时间,并针对所述周期性的批处
理任务逻辑生成一条单独的任务实例,并标注所述单独的任务实例的执行时间、计划开始
执行时间、实际开始执行时间和实际结束执行时间;
在所述登记记录表中设置标志位,用于存储所述单独的任务实例的执行状态。
优选的,在所述任务调度标识对应的批处理任务逻辑为遇到节假日需要特殊处理
的任务、每N(N>1)日/周执行的任务、每个执行日可能执行多次的任务或月末执行的任务的
情况下,调度执行所述批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应
的批处理任务逻辑,包括:
在每天的预设时刻判断当日是否是执行日;
若当日是执行日,则执行父任务,以判断是否应该预约子任务,所述子任务为所述
批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理任务逻辑中
的某一个批处理任务逻辑;
若应该预约子任务,则预约所述子任务;
若不应该预约子任务,则不预约所述子任务。
优选的,判断是否应该预约子任务,包括:
判断预约日期是否为节假日,得到第一判断结果;
判断所述预约日期是否为执行日,得到第二判断结果;
根据所述第一判断结果和所述第二判断结果确定是否预约所述子任务。
一种批处理任务调度装置,应用于任务调度框架Quartz服务器,所述装置包括:
生成模块,用于扫描登记记录表,将所述登记记录表中的每条定义分别生成任务
调度标识,所述登记记录表中的每条定义包括批处理任务逻辑的索引、执行任务类型、任务
执行周期或频率;
注册模块,用于将生成的各个任务调度标识注册到批处理框架SpringBatch的任
务仓库中,以建立各个所述任务调度标识与所述批处理框架SpringBatch的任务仓库中批
处理任务逻辑的对应关系;
调度执行模块,用于按照各个所述任务调度标识对应的任务执行频率或周期,调
度执行所述批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理
任务逻辑。
优选的,所述调度执行模块包括:
生成单元,用于生成所述周期性的批处理任务逻辑的下一次执行时间,并针对所
述周期性的批处理任务逻辑生成一条单独的任务实例,并标注所述单独的任务实例的执行
时间、计划开始执行时间、实际开始执行时间和实际结束执行时间;
设置单元,用于在所述登记记录表中设置标志位,用于存储所述单独的任务实例
的执行状态。
优选的,所述调度执行模块包括:
判断单元,用于在每天的预设时刻判断当日是否是执行日,若当日是执行日,则触
发执行单元;
所述执行单元,用于执行父任务,以判断是否应该预约子任务,所述子任务为所述
批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理任务逻辑中
的某一个批处理任务逻辑;
若应该预约子任务,则预约所述子任务;
若不应该预约子任务,则不预约所述子任务。
优选的,所述执行单元包括:
执行子单元,用于执行父任务,以判断预约日期是否为节假日,得到第一判断结
果;判断所述预约日期是否为执行日,得到第二判断结果;根据所述第一判断结果和所述第
二判断结果确定是否预约所述子任务。
与现有技术相比,本申请的有益效果为:
在本申请中,通过任务调度框架Quartz扫描登记记录表,将所述登记记录表中的
每条定义分别生成任务调度标识;将生成的各个任务调度标识注册到批处理框架Spring
Batch的任务仓库中,以建立各个所述任务调度标识与所述批处理框架Spring Batch的任
务仓库中批处理任务逻辑的对应关系;按照各个所述任务调度标识对应的任务执行频率或
周期,调度执行所述批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的
批处理任务逻辑,实现了批处理任务的调度执行。
由于批处理任务调度方法使用任务调度框架Quartz和批处理框架Spring Batch
结合的方式,实现批处理任务的调度执行,结合批处理框架Spring Batch强大的批处理业
务处理能力和任务调度框架Quartz强大的任务调度能力,提高了批处理任务调度执行的能
力,因此提高了调度执行批处理任务的效率。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使
用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于
本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其
他的附图。
图1是本申请提供的Quartz核心元素之间关系的示意图;
图2是本申请提供的一种Quartz线程视图;
图3是本申请提供的批处理任务调度方法的一种流程图;
图4是本申请提供的批处理任务调度方法的另一种流程图;
图5是本申请提供的批处理任务调度方法的一种子流程图;
图6是本申请提供的批处理任务调度方法的另一种子流程图;
图7是本申请提供的批处理任务调度装置的一种逻辑结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完
整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于
本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他
实施例,都属于本申请保护的范围。
实施例一
在本实施例中,提供了一种批处理任务调度方法,应用于任务调度框架Quartz服
务器,任务调度框架Quartz服务器上运行任务调度框架Quartz。
其中,任务调度框架Quartz(后续简称为Quartz)的基本概念及原理如下:
Quartz是Open Symphony开源组织在任务调度领域的一个开源项目,完全基于
Java实现。作为一个优秀的开源调度框架,Quartz具有功能强大,应用灵活,易于集成的特
点。
1、Quartz具有以下特点:
强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存
储方式;
分布式和集群能力。
另外,作为Spring默认的调度框架,Quartz很容易与Spring集成实现灵活可配置
的调度功能。
2、Quartz用到的一些专用词汇,在此声明:
scheduler:任务调度器
trigger:触发器,用于定义任务调度时间规则
job:任务,即被调度的任务
misfire:错过的,指本来应该被执行但实际没有被执行的任务调度
3、Quartz任务调度的基本实现原理
(1)核心元素
Quartz任务调度的核心元素是scheduler,trigger和job,其中trigger和job是任
务调度的元数据,scheduler是实际执行调度的控制器。
在Quartz中,trigger是用于定义调度时间的元素,即按照什么时间规则去执行任
务。Quartz中主要提供了四种类型的trigger:
SimpleTrigger,
CronTirgger,
DateIntervalTrigger,
NthIncludedDayTrigger。
这四种trigger可以满足企业应用中的绝大部分需求。
在Quartz中,job用于表示被调度的任务。主要有两种类型的job:无状态的
(stateless)和有状态的(stateful)。对于同一个trigger来说,有状态的job不能被并行执
行,只有上一次触发的任务被执行完之后,才能触发下一次执行。Job主要有两种属性:
volatility和durability,其中volatility表示任务是否被持久化到数据库存储,而
durability表示在没有trigger关联的时候任务是否被保留。两者都是在值为true的时候
任务被持久化或保留。一个job可以被多个trigger关联,但是一个trigger只能关联一个
job。
在Quartz中,scheduler由scheduler工厂创建:DirectSchedulerFactory或者
StdSchedulerFactory。第二种工厂StdSchedulerFactory使用较多,因为
DirectSchedulerFactory使用起来不够方便,需要作许多详细的手工编码设置。Scheduler
主要有三种:RemoteMBeanScheduler,RemoteScheduler和StdScheduler。
Quartz核心元素之间的关系如图1所示。
图1.Quartz核心元素关系图
(2)线程视图
在Quartz中,有两类线程,Scheduler调度线程和任务执行线程,其中任务执行线
程通常使用一个线程池维护一组线程。
Quartz线程视图请参见图2。
Scheduler调度线程主要有两个:执行常规调度的线程,和执行misfired trigger
的线程。常规调度线程轮询存储的所有trigger,如果有需要触发的trigger,即到达了下一
次触发的时间,则从任务执行线程池获取一个空闲线程,执行与该trigger关联的任务。
Misfire线程是扫描所有的trigger,查看是否有misfired trigger,如果有的话根据
misfire的策略分别处理。
(3)数据存储
Quartz中的trigger和job需要存储下来才能被使用。Quartz中有两种存储方式:
RAMJobStore,JobStoreSupport,其中RAMJobStore是将trigger和job存储在内存中,而
JobStoreSupport是基于jdbc将trigger和job存储到数据库中。RAMJobStore的存取速度非
常快,但是由于其在系统被停止后所有的数据都会丢失,所以在通常应用中,都是使用
JobStoreSupport。
在Quartz中,JobStoreSupport使用一个驱动代理来操作trigger和job的数据存
储:StdJDBCDelegate。StdJDBCDelegate实现了大部分基于标准JDBC的功能接口,但是对于
各种数据库来说,需要根据其具体实现的特点做某些特殊处理,因此各种数据库需要扩展
StdJDBCDelegate以实现这些特殊处理。
相应的,与任务调度框架Quartz结合使用的批处理框架Spring Batch(后续简称
为Spring Batch)的具体内容如下:
Spring Batch是一个轻量级的、完善的批处理框架,只在帮助企业建立健壮、高效
的批处理应用。Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为
基础开发,是的已经使用Spring框架的开发者或者企业更容易访问和利用企业原有服务。
Spring Batch提供了大量可复用的组件,包括日志、追踪、失误、任务作业的统计、
任务重启、跳过、重复、资源管理。对于大数据量和高性能的批处理任务,Spring Batch同样
提供了高级功能和特性来支持,比如分区功能、远程功能。总之,通过Spring Batch能够支
持简单的、复杂的和大数据量的批处理作业。
Spring Batch是一个批处理应用框架,不是调度框架,但需要和调度框架合作来
构建完成批处理任务。它只关注批处理任务相关的问题,如事物、并发、监控、执行等,并不
提供相应的调度功能。如果需要使用调度框架,在商业软件和开源软件中已经有很多优秀
的企业级调度框架(如Quartz、Tivoli、Control-M、Cron等)可以使用。
请参见图3,其示出了本申请提供的批处理任务调度方法的一种流程图,可以包括
以下步骤:
步骤S11:扫描登记记录表,将所述登记记录表中的每条定义分别生成任务调度标
识,所述登记记录表中的每条定义包括批处理任务逻辑的索引、执行任务类型、任务执行周
期或频率。
任务调度标识中也包括批处理任务逻辑的索引、执行任务类型、任务执行周期或
频率。其中,批处理任务逻辑的索引用于确定批处理任务逻辑。
批处理任务逻辑由批处理框架Spring Batch完成。批处理任务逻辑针对在日间和
日终作业中存在很多需要定时或者周期处理的业务而生成,其中,在日间和日终作业中存
在很多需要定时或者周期处理的业务具体可以为:一些业务需要在每月的最后一天或者最
后两天执行;一些业务可能会在每天定时执行;周期执行的任务。
批处理任务逻辑的完成过程具体为:在批处理框架Spring Batch中,采用类似于
普通的Spring Service Bean的开发流程,唯一区别在需要实现指定接口,实现该指定接口
的方法dealAutoTsk(),在该dealAutoTsk()方法中完成自动任务需要完成的批处理业务
逻辑。
步骤S12:将生成的各个任务调度标识注册到批处理框架Spring Batch的任务仓
库中,以建立各个所述任务调度标识与所述批处理框架Spring Batch的任务仓库中批处理
任务逻辑的对应关系。
步骤S13:按照各个所述任务调度标识对应的任务执行频率或周期,调度执行所述
批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理任务逻辑。
在本申请中,通过任务调度框架Quartz扫描登记记录表,将所述登记记录表中的
每条定义分别生成任务调度标识;将生成的各个任务调度标识注册到批处理框架Spring
Batch的任务仓库中,以建立各个所述任务调度标识与所述批处理框架Spring Batch的任
务仓库中批处理任务逻辑的对应关系;按照各个所述任务调度标识对应的任务执行频率或
周期,调度执行所述批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的
批处理任务逻辑,实现了批处理任务的调度执行。
由于批处理任务调度方法使用任务调度框架Quartz和批处理框架Spring Batch
结合的方式,实现批处理任务的调度执行,结合批处理框架Spring Batch强大的批处理业
务处理能力和任务调度框架Quartz强大的任务调度能力,提高了批处理任务调度执行的能
力,因此提高了调度执行批处理任务的效率。
在本实施例中,在所述任务调度标识对应的批处理任务逻辑为实时性的批处理任
务逻辑的情况下,按照各个所述任务调度标识对应的任务执行频率或周期,调度执行所述
批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理任务逻辑之
后,不计算实时性的批处理任务逻辑的下次执行时间。
在所述任务调度标识对应的批处理任务逻辑为周期性的批处理任务逻辑的情况
下,按照各个所述任务调度标识对应的任务执行频率或周期,调度执行所述批处理框架
Spring Batch的任务仓库中各个所述任务调度标识对应的批处理任务逻辑之后,还需要执
行的步骤请参见图4,还可以包括以下步骤:
步骤S14:生成所述周期性的批处理任务逻辑的下一次执行时间,并针对所述周期
性的批处理任务逻辑生成一条单独的任务实例,并标注所述单独的任务实例的执行时间、
计划开始执行时间、实际开始执行时间和实际结束执行时间。
步骤S15:在所述登记记录表中设置标志位,用于存储所述单独的任务实例的执行
状态。
执行步骤S14和步骤S15可以方便周期性的批处理任务逻辑的查询和确认。
在所述任务调度标识对应的批处理任务逻辑为遇到节假日需要特殊处理的任务、
每N(N>1)日/周执行的任务、每个执行日可能执行多次的任务或月末执行的任务的情况下,
调度执行所述批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的批处
理任务逻辑的具体过程可以为:
步骤A11:在每天的预设时刻判断当日是否是执行日。
若是,则执行步骤A12。
步骤A12:执行父任务,以判断是否应该预约子任务,所述子任务为所述批处理框
架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理任务逻辑中的某一个
批处理任务逻辑。
若判断结果为应用预约子任务,则预约所述子任务;若判断结果为不应该预约子
任务,则不预约所述子任务。
在预约子任务后,即可以在预约的时间执行子任务。
在本实施例中,判断是否应该预约子任务的具体过程为:
步骤A21:判断预约日期是否为节假日,得到第一判断结果。
任务调度框架Quartz支持自定义节假日,具体将自定义节假日统一存储在约定的
数据表中,在约定的数据包中查询预约日期是否为节假日即可。
步骤A22:判断所述预约日期是否为执行日,得到第二判断结果。
执行日是指不考虑节假日时应当执行的日期,根据预约的数据中执行周期、年工
作月、月工作日(周工作日)、执行频率等条件,判断预约日期是否为执行日。该逻辑被重复
使用的次数较多,因此将该逻辑单独编码成为一个独立的公共方法。详细的判断逻辑流程
请参见图5。
步骤A23:根据所述第一判断结果和所述第二判断结果确定是否预约所述子任务。
根据所述第一判断结果和所述第二判断结果确定是否预约所述子任务的具体处
理流程可以参见图6。
同时,根据第一判断结果和第二判断结果也可以确定预约何时执行的子任务。
实施例二
与上述方法实施例相对应,本实施例提供了一种批处理任务调度装置,应用于任
务调度框架Quartz服务器,请参见图7,批处理任务调度装置包括:生成模块71、注册模块72
和调度执行模块73。
生成模块,用于扫描登记记录表,将所述登记记录表中的每条定义分别生成任务
调度标识,所述登记记录表中的每条定义包括批处理任务逻辑的索引、执行任务类型、任务
执行周期或频率。
注册模块,用于将生成的各个任务调度标识注册到批处理框架Spring Batch的任
务仓库中,以建立各个所述任务调度标识与所述批处理框架Spring Batch的任务仓库中批
处理任务逻辑的对应关系。
调度执行模块,用于按照各个所述任务调度标识对应的任务执行频率或周期,调
度执行所述批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理
任务逻辑。
在所述任务调度标识对应的批处理任务逻辑为周期性的批处理任务逻辑的情况
下,调度执行模块具体可以包括:生成单元和设置单元。
生成单元,用于生成所述周期性的批处理任务逻辑的下一次执行时间,并针对所
述周期性的批处理任务逻辑生成一条单独的任务实例,并标注所述单独的任务实例的执行
时间、计划开始执行时间、实际开始执行时间和实际结束执行时间。
设置单元,用于在所述登记记录表中设置标志位,用于存储所述单独的任务实例
的执行状态。
在所述任务调度标识对应的批处理任务逻辑为遇到节假日需要特殊处理的任务、
每N(N>1)日/周执行的任务、每个执行日可能执行多次的任务或月末执行的任务的情况下,
调度执行模块具体可以包括:判断单元和执行单元。
判断单元,用于在每天的预设时刻判断当日是否是执行日,若当日是执行日,则触
发执行单元。
所述执行单元,用于执行父任务,以判断是否应该预约子任务,所述子任务为所述
批处理框架Spring Batch的任务仓库中各个所述任务调度标识对应的批处理任务逻辑中
的某一个批处理任务逻辑;
若应该预约子任务,则预约所述子任务;
若不应该预约子任务,则不预约所述子任务。
在本实施例中,执行单元具体可以包括:执行子单元,用于执行父任务,以判断预
约日期是否为节假日,得到第一判断结果;判断所述预约日期是否为执行日,得到第二判断
结果;根据所述第一判断结果和所述第二判断结果确定是否预约所述子任务。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重
点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参
见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将
一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作
之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意
在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那
些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者
设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排
除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本申请所提供的一种批处理任务调度方法及装置进行了详细介绍,本文中
应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助
理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,
在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本
申请的限制。