任务调度详细设计说明书_第1页
任务调度详细设计说明书_第2页
任务调度详细设计说明书_第3页
任务调度详细设计说明书_第4页
任务调度详细设计说明书_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 任务调度知识库1.1 ER图知识库中主要存放任务调度的相关配置信息、控制信息以及执行日志等。在程序访问数据库时,尽量采用标准SQL语法,以方便数据库的移植时不做过多的改动。任务调度数据表包括两大分类,分别记录任务调度核心和任务调度总控相关信息。1.2 表结构及说明1.2.1 任务基本信息表SCH_TASKINFO任务基本信息表记录每个任务的基本信息和常用参数列名字段类型备注TASKIDVARCHAR2(20)任务编号(批量编号)TASKNAMEVARCHAR2(80)任务名称DescribeVARCHAR2(1000)功能描述ERRORINTERRUPTEDnumber(1)是否错误中断(

2、1发生错误后是立即中断退出,0继续执行其他分支)ServerIDvarchar2(20)所属服务器CurrentBatchDateVARCHAR2(20)运行过的最新批量时间AlarmEmailvarchar2(200)警报发送电子邮件地址StartAlarmnumber(1)任务启动提醒(0否,1是)ErrorAlarmnumber(1)任务错误提醒(0否,1是)StopAlarmnumber(1)任务成功提醒(0否,1是)ThreadCountnumber(3)线程池中线程数1.2.2 作业参数配置表SCH_JOBCONFIG作业参数配置表记录每组任务的作业清单相关信息和执行内容参数列名字

3、段类型备注TASKIDVARCHAR2(20)任务编号(批量编号)JOBIDVARCHAR2(20)作业编号JobTypeNUMBER(1)作业类型(1、java程序;2、数据库存储过程;3、操作系统执行脚本;4、执行远程系统脚本)DescribeVARCHAR2(1000)功能描述JobContentVARCHAR2(200)执行的作业内容FixParamVARCHAR2(500)固定参数(用于固定的传入参数内容)ConcurrentVARCHAR2(200)并发条件AttachParamVARCHAR2(500)附加参数(JobType=4时,此处要填写远程连接标识ID)1.2.3 作业依

4、赖关系表SCH_JOBDependences作业依赖关系表记录每个作业开始执行所依赖的前置作业列名字段类型备注TASKIDVARCHAR2(20)任务编号JOBIDVARCHAR2(20)作业编号DependentJobIDVARCHAR2(20)前置作业编号1.2.4 任务调度控制表SCH_SchduleControl任务调度控制表控制任务的运行,插入记录后,服务定时扫描要运行的任务参数列名字段类型备注TASKIDVARCHAR2(20)任务编号BATCHDATEVARCHAR2(20)批量时间RUNMODENUMBER(1)运行方式(0新任务,1重提任务)STATUSNUMBER(1)执行

5、状态(0就绪,1运行中,2成功,3失败,9外部中断)STARTTIMEDATE开始时间ENDTIMEDATE结束时间ERRMSGVARCHAR2(4000)错误信息BATCHNOVARCHAR2(38)批量标识INTERRUPTEDNUMBER(1)是否中断当前任务(1是,2否)1.2.5 任务运行状态表SCH_TaskStatus任务运行状态表记录每组任务正在执行的作业运行状态列名字段类型备注TASKIDVARCHAR2(20)任务编号JOBIDVARCHAR2(20)作业编号BATCHDATEVARCHAR2(20)批量时间STATUSNUMBER(1)执行状态(0就绪,1运行中,2成功,

6、3失败)STARTTIMEDATE开始执行时间ENDTIMEDATE执行结束时间ERRMSGVARCHAR2(4000)错误信息1.2.6 任务子作业运行状态表SCH_TaskChildStatus任务子作业运行状态表记录每组任务正在执行的作业的并发子作业运行状态列名字段类型备注TASKIDVARCHAR2(20)任务编号JOBIDVARCHAR2(20)作业编号CHILDJOBIDVARCHAR2(40)子作业编号BATCHDATEVARCHAR2(20)批量时间STATUSNUMBER(1)执行状态(0就绪,1运行中,2成功,3失败)STARTTIMEDATE开始执行时间ENDTIMEDA

7、TE执行结束时间ERRMSGVARCHAR2(4000)错误信息1.2.7 任务调度控制历史表SCH_HIS_SCHDULECONTROL任务调度控制历史表历史记录的保存列名字段类型备注BATCHNOVARCHAR2(38)批量标识TASKIDVARCHAR2(20)任务编号BATCHDATEVARCHAR2(20)批量时间RUNMODENUMBER(1)运行方式(0新任务,1重提任务,2中断任务)STATUSNUMBER(1)执行状态(0就绪,1运行中,2成功,3失败,9外部中断)STARTTIMEDATE开始时间ENDTIMEDATE结束时间ERRMSGVARCHAR2(4000)错误信息

8、UpdateDatedate更新时间1.2.8 任务运行状态历史表SCH_HIS_TASKSTATUS任务运行状态历史表记录每组任务正在执行的作业运行状态列名字段类型备注BATCHNOVARCHAR2(38)批量标识TASKIDVARCHAR2(20)任务编号JOBIDVARCHAR2(20)作业编号BATCHDATEVARCHAR2(20)批量时间STATUSNUMBER(1)执行状态(0就绪,1运行中,2成功,3失败)STARTTIMEDATE开始执行时间ENDTIMEDATE执行结束时间ERRMSGVARCHAR2(4000)错误信息INTERRUPTEDNUMBER(1)是否中断当前任

9、务(1是,2否)UpdateDatedate更新时间1.2.9 任务子作业运行状态历史表SCH_HIS_TASKCHILDSTATUS任务子作业运行状态历史表记录每组任务正在执行的作业的并发子作业运行状态列名字段类型备注BATCHNOVARCHAR2(38)批量标识TASKIDVARCHAR2(20)任务编号JOBIDVARCHAR2(20)作业编号CHILDJOBIDVARCHAR2(40)子作业编号BATCHDATEVARCHAR2(20)批量时间STATUSNUMBER(1)执行状态(0就绪,1运行中,2成功,3失败)STARTTIMEDATE开始执行时间ENDTIMEDATE执行结束时

10、间ERRMSGVARCHAR2(4000)错误信息UpdateDatedate更新时间1.2.10 任务执行计划表SCH_TaskPlan任务执行计划表用于记录每个任务的触发规则列名字段类型备注TaskIDVARCHAR2(20)任务编号DescribeVARCHAR2(1000)执行计划描述TriggerRule1varchar2(20)触发规则1(仿Crontab,0 0 8 1 * ?)TriggerRule2varchar2(20)触发规则2(仿Crontab)TriggerRule3varchar2(20)触发规则3(仿Crontab)ExceptiveRulevarchar2(20

11、0)不执行批量的规则(例:读取某日历表,存在于该表中的日期,将不能触发) 判断某个批量日期是否触发的SQL中,批量日期代号为#DATADATE#,返回记录数不为0,则表示存在例外,不触发statenumber(1)状态(0失效,1启用)BatchDateRulevarchar2(200)批量时间规则(以触发规则中的时间,根据知识库所在的SQL规则,算出批量日期,#TRIGGERDATETIME#表示触发的时间变量 如select to_char(#TRIGGERDATETIME#-1,YYYYMMDD) from dual)NextTriggerDateDate下次触发时间(是指按触发规则计算

12、出来的下次启动时间)NextBatchDatevarchar2(20)下次批量时间(通过BatchDateRule计算,若不满足ExceptiveRule,则填入UNKNOWN)ReloadFlagnumber(1)是否需要重新加载(0不用重新加载,1需要重新加载),用于重新更改触发规则的标志ERRMSGVARCHAR2(1000)错误信息1.2.11 事件依赖关系表SCH_EventDependentRule事件依赖关系表记录每个任务的启动,所依赖的事件与规则列名字段类型备注TaskIDVARCHAR2(20)任务编号EventIDVARCHAR2(50)事件标识(可以是任务编号、文件名(固

13、定的唯一名称)、其他自定义事件标识)EventTypenumber(2)事件类型(1任务计划事件、2任务执行完成事件、3文件到来事件、9自定义事件)DateOffsetnumber(2)批量时间偏移量(0或空表示批量日期相同,1表示在所依赖的事件对应日期加一天作业批量日期)EventType=1时,此字段无效。statenumber(1)状态(0失效,1启用)1.2.12 事件序列表SCH_EventSequence事件序列表记录事件的队列列名字段类型备注EventDateDate事件产生时间EventIDVARCHAR2(50)事件标识(可以是任务编号、文件名(固定的唯一名称)、其他自定义事

14、件标识)EventTypenumber(2)事件类型(1任务计划事件、2任务执行完成事件、3文件到来事件、9自定义事件)BatchDateVARCHAR2(20)批量时间1.2.13 事件序列历史表SCH_HIS_EventSequence事件序列历史表定期将事件序列表中的过期数据存入历史表列名字段类型备注EventDateDate事件产生时间EventIDVARCHAR2(50)事件标识(可以是任务编号、文件名(固定的唯一名称)、其他自定义事件标识)EventTypenumber(2)事件类型(1任务计划事件、2任务执行完成事件、3文件到来事件、9自定义事件)BatchDateVARCHAR

15、2(20)批量时间2 任务调度总控2.1 总控概述2.1.1 功能点分析任务调度总控服务,是一个单独启动的服务程序。该服务负责的功能是按设定的规则和逻辑创建相应的任务批量,控制批量的日期、批量何时启动、以及批量的依赖关系的控制。功能示例如下:l 控制A批量每天10点启动。l 批量B每天12点开始,等待相关文件到达后启动l 批量C每天13点开始等待批量B执行完成,且文件到达后启动l 批量D每天早上8点开始,等待前一天的批量C执行完成后才能启动l 批量E每月底9点启动,且必须等批量D完成后才开始执行l 批量F每天11点执行,且如果当前为月底,则必须等待E执行完成后启动,如果不为月底,则11点立即可

16、以启动根据预设的实现功能点,设计了以下的总控服务逻辑。采用事件进行驱动,将所有可能影响一个任务启动的条件都当作一个事件进行管理和监控。然后配置每个任务的依赖条件,通过监控任务若满足相应的依赖事件,则发起一个任务批量到任务调度控制表中,开始执行这个批量。任务总控实现逻辑图如下:根据设计的逻辑,任务调度总控服务主要区分三个模块:l 任务执行计划控制模块,通过配置执行计划定时器,生成和控制每个任务的启动时间,同时产生相应的任务计划事件,写入事件序列表中。l 任务批量生成模块,得到每个任务的依赖配置,通过循环读取事件序列表中的事件数据,匹配出符合依赖条件的任务,写入任务调度控制表中,以便任务调度核心服

17、务来执行这个任务批量。l 历史数据清理模块,主要功能是清理过期的历史数据。事件序列表中过期的事件数据保存到事件序列历史表中;将事件序列历史表、任务调度控制历史表、任务运行状态历史表、任务子作业运行状态历史表中的过期数据删除。2.1.2 事件类型设计根据任务调度所使用的场景,整理了以下事件类型和事件代码。l 任务计划事件(类型编号1):约定每个任务必须指定一个任务计划事件作为任务的主事件。任务指定启动的日期、时间后,总控服务的“任务执行计划控制模块”中定时器自动产生这个事件,并写入到事件序列表中。l 任务执行完成事件(类型编号2):由于存在一个批量的启动依赖另一个批量的结束的需求,因此定义这个事

18、件。这个事件在“任务调度核心服务”中生成,当一个任务批量执行完成后,根据配置可以往事件序列表中写一个“任务执行完成事件”。l 文件到来事件(类型编号3):很多批量运行,需要进行数据文件写入。当批量用到的数据到齐后,批量才能启动。通过其他程序监控文件的到来,如果文件到齐后,则写入一个事件到事件序列表中。l 自定义事件(类型编号9):用于其它自定义的事件的依赖实现,可能通过自定义其它事件,来实现一些特殊的依赖关系。事件的依赖关系都保存于“事件依赖关系表”中,每个任务可以指定多个依赖的事件,但必须指定一个“任务计划事件”作为主事件。关于事件编号的约定:“任务计划事件”主事件的编号与任务编号相同,事件

19、类型为1。“任务执行完成事件”对应的事件编号也是任务编号,事件类型为2。“文件到齐事件”编号可以根据实际的文件情况取名,必须固定和“事件依赖关系表”中相同,事件类型为3。“自定义事件”编号可以任取,事件类型为9。所有的事件编号长度有限制,不超过20字符。2.2 总控主线程2.2.1 Chief类任务总控程序从Chief类进入,读取初始化以下参数:quartz定时器配置、日志配置、以及数据库连接、线程循环间隔等参数。它是主线程。总控主线程控制“任务执行计划控制”线程的启动、控制“任务批量生成”线程的启动。同时监控这两大模块的运行状况,若发生异常或线程崩溃,则重建相应的线程。2.2.2 Chief

20、Persist接口和ChiefPersistDB类ChieftPersist接口定义了所有和数据库交互的接口方法定义,ChiefPersistDB类实现了ChieftPersist接口的所有方法。ChieftPersistDB中的数据库访问SQL脚本,都是基于Oracle 10g测试编写的,尽量采用标准SQL语法,以方便实现数据库的移植。若有不支持该SQL脚本的数据库,需要扩展ChieftPersist接口,重新编写相应的类,修改SQL语句。通过类的多态性,实现新的类的该问。2.3 任务执行计划控制模块任务执行计划控制模块,功能是根据“任务执行计划表”中的每个任务的配置的定时器内容,确定“任务

21、计划事件”的产生的时间点,并计算相应的批量日期。当触发时间到达时,将事件插入到“事件序列表”中即可。2.3.1 PlanControl类PlanControl类继承于Runnable接口,产生任务执行计划控制的线程。线程定时循环扫描“任务执行计划表”,将新的任务定时计划和有修改的定时计划更新到Quartz定时器中,以刷新任务的触发时间等。同时,会将定时清理历史数据的功能加入到定时器中执行,方法:registHisDataClear。2.3.2 QuartzSchedule类用于管理任务执行计划中的触发处理。引用开源框架Quartz,定时触发启动,将“任务计划事件”写入到事件序列表中。以下介绍Q

22、uartz框架中仿Crontab格式的定时器表达式。Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别。区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级。UNIX 给出五个域(分、时、日、月和周),Quartz 提供七个域。名称是否必须允许值特殊字符秒是0-59, - * /分是0-59, - * /时是0-23, - * /日是1-31, - * ? / L W C月是1-12 或 JAN-DEC, - * /周是1-7 或 SUN-SAT, - * ? / L C #年否空 或 1970-20

23、99, - * /月份和星期的名称是不区分大小写的。FRI 和 fri 是一样的。理解特殊字符* 星号使用星号(*) 指示着你想在这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发这个 trigger。表达式样例:0 * 17 * * ?意义:每天从下午5点到下午5:59中的每分钟激发一次 trigger。它停在下午 5:59 是因为值 17 在小时域上,在下午 6 点时,小时变为 18 了,也就不再理会这个 trigger,直到下一天的下午5点。? 问号? 号只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为 ? 字符是 我并不关心在该域上是什么值。 这不同于星

24、号,星号是指示着该域上的每一个值。? 是说不为该域指定值。不能同时这两个域上指定值的理由是难以解释甚至是难以理解的。基本上,假定同时指定值的话,意义就会变得含混不清了:考虑一下,如果一个表达式在日域上有值11,同时在周域上指定了 WED。那么是要 trigger 仅在每个月的11号,且正好又是星期三那天被激发?还是在每个星期三的11号被激发呢?要去除这种不明确性的办法就是不能同时在这两个域上指定值。只要记住,假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?。表达式样例:0 10,44 14 ? 3 WEB意义:在三月中的每个星期三的下午 2:10 和 下午 2:44 被触发。

25、, 逗号逗号 (,) 是用来在给某个域上指定一个值列表的。例如,使用值 0,15,30,45 在秒域上意味着每15秒触发一个 trigger。表达式样例:0 0,15,30,45 * * * ?意义:每刻钟触发一次 trigger。/ 斜杠斜杠 (/) 是用于时间表的递增的。我们刚刚用了逗号来表示每15分钟的递增,但是我们也能写成这样 0/15。表达式样例:0/15 0/30 * * * ?意义:在整点和半点时每15秒触发 trigger。- 中划线中划线 (-) 用于指定一个范围。例如,在小时域上的 3-8 意味着 3,4,5,6,7 和 8 点。 域的值不允许回卷,所以像 50-10 这样

26、的值是不允许的。表达式样例:0 45 3-8 ? * *意义:在上午的3点至上午的8点的45分时触发 trigger。L 字母L 说明了某域上允许的最后一个值。它仅被日和周域支持。当用在日域上,表示的是在月域上指定的月份的最后一天。例如,当月域上指定了 JAN 时,在日域上的 L 会促使 trigger 在1月31号被触发。假如月域上是 SEP,那么 L 会预示着在9月30号触发。换句话说,就是不管指定了哪个月,都是在相应月份的时最后一天触发 trigger。表达式 0 0 8 L * ? 意义是在每个月最后一天的上午 8:00 触发 trigger。在月域上的 * 说明是 每个月。当 L 字

27、母用于周域上,指示着周的最后一天,就是星期六 (或者数字7)。所以如果你需要在每个月的最后一个星期六下午的 11:59 触发 trigger,你可以用这样的表达式 0 59 23 ? * L。当使用于周域上,你可以用一个数字与 L 连起来表示月份的最后一个星期 X。例如,表达式 0 0 12 ? * 2L 说的是在每个月的最后一个星期一触发 trigger。不要让范围和列表值与 L 连用虽然你能用星期数(1-7)与 L 连用,但是不允许你用一个范围值和列表值与 L 连用。这会产生不可预知的结果。W 字母W 字符代表着平日 (Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平

28、日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。例如,日域中的 15W 意味着 离该月15号的最近一个平日。 假如15号是星期六,那么 trigger 会在14号(星期四)触发,因为距15号最近的是星期一,这个例子中也会是17号(译者Unmi注:不会在17号触发的,如果是15W,可能会是在14号(15号是星期六)或者15号(15号是星期天)触发,也就是只能出现在邻近的一天,如果15号当天为平日直接就会当日执行)。W 只能用在指定的日域为单天,不能是范围或列表值。# 井号# 字符仅能用于周域中。它用于指定月份中的第几周的哪一天。例如,如果你指定周域的值为 6#3,它意思是某

29、月的第三个周五 (6=星期五,#3意味着月份中的第三周)。另一个例子 2#1 意思是某月的第一个星期一 (2=星期一,#1意味着月份中的第一周)。注意,假如你指定 #5,然而月份中没有第 5 周,那么该月不会触发。2.3.3 任务计划事件生成逻辑SCH_TASKPLAN任务执行计划表中记录了每个任务的事件触发规则和批量时间计算规则。TriggerRule字段有三个,可以配置三个定时器规则,若满足一个触发条件,则触发计算事件的批量日期。这些定时器规则会写入Quartz中执行。事件的批量日期的计算,通过SCH_TASKPLAN.BATCHDATERULE字段,配置的SQL,在数据库中生成相应的批量

30、日期。将批量日期作为ExceptiveRule字段的条件,查看这个批量日期是否为例外,不执行批量。如果满足例外日期(如节假日)则不生成事件。否则将事件插入到事件序列表中。同时,程序为根据Quartz定期生成下次触发时间和计算批量日期写入SCH_TASKPLAN表中,如果存在且满足例外配置项,无法计算下次批量日期,则写入UNKNOW。2.4 任务批量生成模块任务批量生成模块的功能,是定时的读取事件序列表和事件依赖关系表,循环每个存在主事件的任务,匹配事件序列表中的事件,将所有完全匹配的批量生成并写入任务调度控制表中,供任务调度服务来执行。2.4.1 BatchCreatorControl类Pla

31、nControl类继承于Runnable接口,产生任务批量生成的线程。线程定时循环,匹配满足事件依赖条件的任务,然后写入到任务调度控制表中。2.4.2 任务批量匹配逻辑步骤如下:l 读取需要监控的任务和相应的批量编号。关联SCH_PLAN表中最新的批量时间,获取SCH_EventSequence中大于上次批量日期的最小的一个“任务执行计划事件”作为每个任务的匹配批量时间。l 读取每个任务的依赖事件。循环每个任务,从SCH_EventDependentRule中读取任务所依赖的事件。l 匹配每个事件是否满足。循环每个任务所依赖的事件,看该事件是否存在。通过依赖事件的时间偏移量,转换每个事件的批量

32、日期。将转换后的日期再和任务的批量日期做比较,如果转换后的事件日期等于本次的任务批量日期,则满足条件。循环每个依赖项,所有的依赖项都满足,则说明事件完全匹配。l 写入任务调度控制表。如果批量对应的所有依赖事件都匹配成功,则将这个任务批量写入到SCH_SchduleControl表中。l 更新任务基本信息表SCH_TASKINFO中的最新批量日期,以便下次循环时,以这个日期作为基点,查找下个批量日期。2.4.3 跨日期的批量依赖问题问题,每个任务的运行规则不一样,有些任务每天都产生批量,有些任务每个月运行一次,或每周运行一次。当批量间存在有依赖关系时,如果一个日频度的批量依赖于一个月频度的批量执

33、行完成,则需要做特殊处理,否则如果月频度批量一直不运行,那么日频度的批量也无法正常的启动。处理办法,判断任务的依赖项,如果存在有一个任务执行依赖于另一个任务的完成的情况,则满足以下所有条件,则该依赖项可忽略:1、 读取这个依赖项对应的任务的上次批量执行日期,批量日期大于所依赖的任务的上次批量时间2、 读取这个依赖项对应的任务的下次批量执行日期,批量日期小于所依赖的任务的下次批量时间3、 根据任务的批量时间和偏移量,反算所依赖的事件对应的事件中的批量时间,在事件序列表中,不存在该事件和批量日期。2.5 历史数据清理模块2.5.1 事件序列表清理事件序列表中数据用于循环匹配,以生成调度批量的指令。

34、需要定期将事件序列表中不使用的数据清理,并存入历史表中,减少事件表中数据量,提交查询效率。可根据配置参数,将事件序列表中数据保留N天后,清理并存入相应的事件序列历史表中。在清理数据时,需要考虑任务依赖的事件,如果存在批量日期所依赖的偏移量较大(如,所依赖的数据为10天前的数据),则不能清理所依赖的数据,否则可能引起批量无法正常启动。2.5.2 历史数据表清理通过Qurart定时器,固定设置历史数据清理的频率,目前是每6小时启动一次数据清理线程。通过配置参数,决定历史数据保存天数据(默认180天)。超过该区间的数据将从历史表中删除,参考字段UpdateDate。历史表如下:SCH_HIS_SCH

35、DULECONTROLSCH_HIS_TASKSTATUSSCH_HIS_TASKCHILDSTATUSSCH_HIS_EVENTSEQUENCE3 任务调度核心任务调度核心部分和总控部分分离,可以接收总控服务中发起的调度指令,同时可以接受临时和手工发起的调度指令。所有的任务调度指令都是写入SCH_SCHDULECONTROL表中,任务调度核心通过定期扫描该表,确定需要处理的任务。下图为任务调度服务的基本框架图:MainService为主线程,用于监控SCH_SchduleControl任务调度控制表中的批量指令,同时调用该批量。发起和管理每个任务线程的启动和中断,以及插件包的加载、日志、配置

36、等信息初始化。TaskSchedulePool为任务调度的线程池,由主线程创建,每个批量启动后就会创建一个TaskScheduleControl线程来处理这个任务的具体执行内容。TaskScheduleControl线程实现类,每个单独的任务创建一个实例。用于控制一个任务中每个作业的执行,按依赖关系先后顺序调用作业。作业的状态更新和读取通过调用JobExchangeComponent类实现;作业的具体执行通过Quartz框架提供的线程池来实现。JobExchangeComponent类实现作业中的数据结构组建和更新,当作业执行状态变更时,更新相应的数据结构和知识库中的内容;读取当前要处理的作业

37、队列。Quartz 封装第三方框架,提供异步作业执行的线程池,用于定时执行指定作业。JobExecute提供通用作业执行接口,同时提供监听器,当作业执行完成后,返回执行结果到JobExchangeComponent。通过实现通用作业接口来调用各种功能。3.1 任务调度服务主模块3.1.1 系统初始化载入系统的配置项的数据,包括数据库驱动、连接参数;服务器标识、任务扫描频率、插件目录、是否写事件序列表等。根据插件目录,载入插件类。数据库访问实例化。任务线程池初始化。3.1.2 任务线程管理单例模式类TaskThreadManager,用于登记所有的任务线程。当有新任务创建时,在该对象中注册,任务

38、执行完后注销。提供线程查询功能,可判断系统是否存在某个任务线程。提供任务中断功能,当需要外部中断某个正在执行的任务线程时,可调用中止。3.1.3 新任务处理系统定时重复读取SCH_SchduleControl任务调度控制表,按批量日期的顺序,将要处理的任务读取进来,包括新任务和重提任务。立即更新任务的状态为执行中。每条批量任务创建一个新的任务控制线程TaskScheduleControl,传入任务编号、批量日期、线程数等。3.1.4 中断处理系统定时重复读取SCH_SchduleControl任务调度控制表中标识为外部中断的指令,获取相应的任务编号、批量日期。查询线程池中是否存在该线程,如果存

39、在,立即发起中断指令。3.2 作业执行控制模块3.2.1 类介绍1) TaskScheduleControl类TaskSchedulerControl类为任务执行的控制类,继承Runnable接口。每个任务都产生一个独立的线程,负责控制整个任务的运行状态控制和更新。主要功能点:创建并初始化Quartz Schedule,用作作业的执行容器。提供作业的创建和监听器的创建功能。线程循环从JobExchangeComponent类中获取可以执行的作业列表,若作业存在有子作业时,还需要将一个作业拆分成多个子作业加入线程池中进行执行。提供任务的中断接口,供外部调用。调用JobExchangeCompon

40、ent中的各种任务状态更新接口。任务执行完成后调用运行状态备份功能、任务完成事件写入功能。(供总控中事件序列表使用)2) JobExchangeComponent类作业的获取和作业状态转换的组件,用于对作业执行顺序控制和执行状态监控(线程同步)。提供以下方法:l setInterruptedError:指定当前任务如果出现错误,立即中断还是将可运行的分支继续执行 ture为立即中断, false为不中断。l setBreakpointAgain:指标当前任务是否为断点重提的作业。l initialize:初始化内存中的作业配置表、作业状态表、作业依赖关系表;同时提供知识库中的相关数据初始化动作

41、。根据当前任务是新的任务还是重提的任务,初始化方式有所不同。若当前任务为新任务,需要根据SCH_JOBCONFIG配置数据初始化新的作业列表结构;若当前任务为重提任务,则将上次运行的结果从数据库中读取,并将错误的任务更新为就绪状态,并更新到内存中,运行时只将状态为未运行过的作业或子作业进行执行。l getListReadyingJob:通过该方法可以获取还没有运行作的作业列表,即所有运行状态为就绪状态的作业列表。l getNextAvailableJob:获取下一个可执行的作业清单。获取的规则是循环就绪作业列表,找到作业的前置作业都为运行成功或者没有前置作业的项,返回。l removeRead

42、yinJob:当一个作业加入运行队列后,从就绪队列中移除。l exchangeJobStatus:当作业的状态发生更改时,调用这个方法,作业的状态有4种,分别为就绪、运行中、执行成功、执行失败。更新作业的状态时,如果当前调用的是子作业状态,会同时对子作业的父作业状态做相应的同步更新。l exchangeScheduleStatus:更新整个任务的状态,任务的状态包括5种:就绪、运行中、执行成功、执行失败、外部中断。l getChildJobStatus:获取一个作业中的所有子作业的状态。l getJobStatus:获取一个作业的状态。l BackupData:当任务执行完成后,将当前任务中用

43、到的任务调度控制表、任务运行状态表、任务子作业运行状态表数据存入历史表中。l writeEventSequence:任务完成后,如果需要写入事件序列表,则调用这个方法。3) TaskPersist接口和TaskPersistDB类TaskPersist接口定义了所有和数据库交互的接口方法,TaskPersistDB类实现了TaskPersist接口的所有方法。JobExchangeComponent中实现的所有访问数据库方法都是通过调用TaskPersist接口来封装。TaskPersistDB中的数据库访问SQL脚本,都是基于Oracle 10g测试编写的,尽量采用标准SQL语法,以方便实现

44、数据库的移植。若有不支持该SQL脚本的数据库,需要扩展TaskPersist接口,重新编写相应的类,修改SQL语句。通过类的多态性,实现新的类的该问。3.2.2 时序图以下时序图大致介绍了一个任务启动后所经历的步骤。3.2.3 数据结构定义上图为每个任务中主要用到的数据结构图。1) JobStatus作业状态每个作业都包含四种运行状态,分别是Ready、Running、Success、Fail。2) MapJobConfig作业配置列表:对应SCH_JOBCONFIG作业参数配置表和SCH_JOBDependences作业依赖关系表表中的配置数据。在任务初始化时载入内存,不会发生变化。这个列表

45、记录作业执行的内容,作业间的依赖关系,是否并发等,主要用到内存中作业结构的初始化。3) MapJobNode作业状态列表:每个JobNode对象记录一个作业项的状态。JobNode记录所有前置作业项、所有后续作业项、前置作业的执行状态(当所有前置作业状态都为Success时,此项为Success,否则记录状态为Running或Ready)、记录当前作业的运行状态。同时指向当前作业的所有子作业节点列表。记录作业错误信息等。4) ListReadyingJob就绪作业队列:作业的就绪队列在任务初始化时,会将所有作业填进这个列表。每当有新作业开始执行,就会从就绪队列中移除。当作业就绪队列为空时,表示

46、任务中所有作业都开始执行或已执行完成。图中,右下角的图形,描述的是一个任务中作业的依赖关系数据结构。每个节点对应一个作业项,该数据结构就是JobNode类型。篮色的箭头指向的是,当前作业完成后可以运行的作业;红色箭头指向的是作业的启动所依赖的前置作业项。3.2.4 作业执行控制场景1) 初始化和作业就绪加载所有作业到就绪作业清单ListReadyingJob;从SCH_JOBCONFIG载入作业树,同时加载作业节点为JobNode。当一个任务开始时,会将作业树中所有的作业初始化为就绪状态,就绪作业清单中包含所有作业代码,所有前置作业、子作业状态均为就绪2) 作业运行中循环:取出所有前置作业为成

47、功或空的,且存在于就绪作业清单ListReadyingJob中的作业节点,为可运行的作业。将可运行作业加入作业线程池中运行。作业运行中:立即从就绪作业清单ListReadyingJob中将要运行的作业移除;将作业添加到作业线程池中运行;将作业设置为运行状态;更新到持久化,填入执行开始时间;3) 作业执行成功作业成功执行完后更新作业状态为成功;更新到持久化,填入作业结束时间;获取作业的所有后续节点,一一判断:若某后续节点A的所有前置节点B、C、D等运行状态都为成功,则将A的前置作业状态设为成功,以触发节点的运行4) 作业执行失败根据配置约定,从就绪作业清单遍历所有该节点所影响的后续节点并删除,或直接清空就绪作业清单所有作业节点;设置作业状态为失败;更新到持久化,填入结束时间,错误信息;后续处理:若这个任务配置为错误立即中断,则就绪作业清单中为空,任务立即停止运行;若错误立即中断配置为否,则遍历所有该错误的后绪节点全部从就绪作业清单中移除,其它作业继续执行,直到结束。3.3 作业接口与实现由于任务调度系统所要调用的内容无法确定,可能是调用数据库存储过程、系统命令、某软件接口、某自定义功能项。为了系统了兼容的调用各种功能,需要定义一个标准的作业调用接口。3.3.1 通用作业调用接口Job

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论