基于MQ和关系型数据库的作业流实现方法及调度系统与流程

文档序号:31510315发布日期:2022-09-14 11:02阅读:117来源:国知局
基于MQ和关系型数据库的作业流实现方法及调度系统与流程
基于mq和关系型数据库的作业流实现方法及调度系统
技术领域
1.本发明涉及作业调度控制技术领域,尤其是涉及一种基于mq和关系型数据库的作业流实现方法及调度系统。


背景技术:

2.在银行系统中,往往需要对操作对象(例如一个文本)按顺序完成一组交易(任务)。
3.经过检索,中国专利cn112613840b公开了一种作业调度控制方法,该方法包括:响应于任务执行指令,获取预设的工作流任务状态表;根据任务执行指令和任务状态表确定待执行任务的作业状态;根据待执行任务的作业状态确定作业调度顺序;控制待执行任务按照作业调度顺序执行待执行任务。该发明通过待执行任务的作业状态信息确定作业调度顺序,作业调度顺序可以由任务执行指令和预设的工作流任务状态表确定,进而得到待执行任务的作业调度,该发明由作业状态信息得到作业调度,根据作业调度顺序执行待执行任务,可以减少和缩短任务的作业时长,提高作业效率。
4.然而,上述技术难以同时支持同步、异步任务、作业断点续做和失败任务跳转,亟需设计一种实现上述功能的作业调动系统及作业流实现方法。


技术实现要素:

5.本发明的目的就是为了克服上述现有技术存在的缺陷而提供了一种基于mq和关系型数据库的作业流实现方法及调度系统,该方法可通过简单配置顺序执行的各项任务,实现作业流自动运行,可同时支持同步、异步任务、作业断点续做和失败任务跳转。
6.本发明的目的可以通过以下技术方案来实现:
7.根据本发明的第一方面,提供了一种基于mq和关系型数据库的数据流实现方法,该方法包括以下步骤:
8.步骤s1、作业触发模块发起新任务,将配置好的作业计划表中的第一个任务对应的mq消息写入任务队列;
9.步骤s2、作业调度模块中的父进程实时监听所述任务队列,从任务队列读取mq消息,找到所述mq消息任务在作业计划表中的位置后,写执行mq消息到执行队列,并根据执行状态更新登记新任务,发起下一个任务mq;
10.步骤s3、任务执行模块从执行队列读取mq消息,执行结束后,同步或异步回复执行结果。
11.优选地,所述步骤s2包括以下子步骤:
12.步骤s21、作业调度模块中的父进程实时监听所述任务队列,从任务队列读取mq消息,并fork子进程处理;
13.步骤s22、子进程按照作业调度接口解析读取到的mq消息,并对任务执行记录表中的任务id进行空值判断;若任务id为空,则根据作业编号在作业计划表查询对应作业的第
一项任务各项信息后,转步骤s26,否则,转步骤s23;
14.步骤s23、判断任务执行记录表是否存在相应任务,若不存在则视为无效mq消息,转步骤s27;若任务执行记录表存在相应任务,则转步骤s24;
15.步骤s24、判断回复项内容是否为回复消息,若是,转步骤s25;若否,按照任务执行接口在执行队列中写入mq消息,此时,若从作业计划表中查询任务为同步执行任务,则从回复队列中读取回复消息,按照作业调度接口解析mq消息后,转步骤s25,否则转步骤s27;
16.步骤s25、更改该项任务的状态,并依据当前状态从作业计划表中查询下一项任务信息或失败跳转任务信息,转步骤s26;
17.步骤s26、为新任务生成任务id,将新任务插入任务执行记录表,按照作业调度接口在任务队列中写入mq消息;
18.步骤s27、退出子进程。
19.优选地,所述作业计划表的字段包括作业编号、任务编号、任务名称、同异步标志、失败跳转任务编号;其中,“作业编号+任务编号”为主键。
20.优选地,所述任务执行记录表的字段包括任务id、操作对象名、作业编号、任务编号、任务名称、开始时间、结束时间和任务执行状态;其中,任务id为主键。
21.优选地,所述作业调度接口对应的字段包括操作对象名、任务id、作业编号以及回复内容;
22.所述任务id由作业调度模块序列生成,每个任务的任务id唯一,若任务id为空值,则该任务为作业流中的第一项任务;所述回复内容为成功、失败和新任务。
23.优选地,所述作业调度接口对应的字段包括操作对象名、任务id、交易码和触发时间。
24.优选地,所述步骤s2中任务队列读取的mq消息包括作业触发模块写入的第一mq消息、作业调度模块写入的第二mq消息以及任务执行模块写入的第三mq消息;
25.所述第一mq消息为触发作业流的第一项任务;所述第二mq消息为触发已记录还尚未执行的新任务;所述第三mq消息为异步任务回复消息。
26.优选地,所述任务执行模块执行的具体交易包括可扩展的c、java和shell脚本。
27.优选地,如果出现作业流异常中断,通过外部程序在所述任务队列中重新写入mq消息,重新执行相应任务。
28.根据本发明的第二方面,提供了一种基于mq和关系型数据库的作业调度系统,包括:
29.作业触发模块,用于发起新任务,将作业计划表中的第一个任务mq消息写入任务队列;
30.作业调度模块,用于从任务队列读取mq消息,找到该mq消息任务在作业计划表中的位置后,写执行mq消息到执行队列,并根据执行状态更新登记新任务,发起下一个任务mq;
31.任务执行模块,用于从执行队列读取mq消息,执行结束后,同步或异步回复执行结果。
32.与现有技术相比,本发明具有以下优点:
33.1)本发明设计的作业流实现方法通过简单配置顺序执行的各项任务,实现了作业
流的自动运行,同时支持同步任务、异步任务、失败任务跳转以及作业异常断点续做;
34.2)本发明的方法基于mq和关系型数据库,各模块间通过队列进行输入输出,耦合度小,可移植性强;
35.3)本发明的作业计划表和任务执行记录表为可配置化,且各模块间配置简单,减少了开发量。
附图说明
36.图1为本发明的作业流实现流程图一;
37.图2为本发明的作业流实现流程图二。
具体实施方式
38.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都应属于本发明保护的范围。
39.实施例
40.术语解释:
41.作业:一个作业(job)中包含多个任务(task)。所有任务执行结束后,该作业即完成;
42.同步任务:作业调度发起任务(队列中写入mq消息)后,还需等待任务的执行结果,则该任务称为同步任务。如果任务执行时间较短,可设计为同步任务;
43.异步任务:作业调度发起任务(队列中写入mq消息)后,无需等待任务的执行结果,可继续执行其它操作,该任务称为异步任务。由于作业调度无需等待异步任务的执行结果,可立即释放资源,所以对于一些执行时间较长的任务可设计为异步。
44.首先给出本发明的系统实施例,一种基于mq和关系型数据库的作业流调度系统,包括作业触发模块、作业调度模块以及任务执行模块,各模块间通过mq消息进行通信,具体为:
45.作业触发器,用于发起新任务,将作业计划表中的第一个任务mq消息写入任务队列;
46.作业调度模块,用于从任务队列读取mq消息,找到该mq消息任务在作业计划表中的位置后,写执行mq消息到执行队列,根据执行状态更新登记新任务,并发起下一个任务mq;
47.任务执行模块,用于从执行队列读取mq消息,执行结束后,同步或异步回复执行结果基于mq和关系型数据库。
48.其中,所述作业计划表中配置有需顺序执行的任务。
49.接下来给出本发明的方法实施例,一种基于mq和关系型数据库的数据流实现方法,该方法包括以下步骤:
50.步骤s1、作业触发模块发起新任务,将配置好的作业计划表中的第一个任务对应的mq消息写入任务队列;
51.步骤s2、作业调度模块中的父进程实时监听所述任务队列,从任务队列读取mq消息,找到所述mq消息任务在作业计划表中的位置后,写执行mq消息到执行队列,并根据执行状态更新登记新任务,发起下一个任务mq,具体为:
52.步骤s21、作业调度模块中的父进程实时监听所述任务队列,从任务队列读取mq消息,并fork子进程处理;
53.步骤s22、子进程按照作业调度接口解析读取到的mq消息,并对任务执行记录表中的任务id进行空值判断;若任务id为空,则根据作业编号在作业计划表查询对应作业的第一项任务各项信息后,转步骤s26,否则,转步骤s23;
54.步骤s23、判断任务执行记录表是否存在相应任务,若不存在则视为无效mq消息,转步骤s27;若任务执行记录表存在相应任务,则转步骤s24;
55.步骤s24、判断回复项内容是否为回复消息,若是,转步骤s25;若否,按照任务执行接口在执行队列中写入mq消息,此时,若从作业计划表中查询任务为同步执行任务,则从回复队列中读取回复消息,按照作业调度接口解析mq消息后,转步骤s25,否则转步骤s27;
56.步骤s25、更改该项任务的状态,并依据当前状态从作业计划表中查询下一项任务信息或失败跳转任务信息,转步骤s26;
57.步骤s26、为新任务生成任务id,将新任务插入任务执行记录表,按照作业调度接口在任务队列中写入mq消息;
58.步骤s27、退出子进程;
59.步骤s3、任务执行模块从执行队列读取mq消息,执行结束后,同步或异步回复执行结果。
60.下面结合附图1和图2对本发明的方法详细阐述。
61.【mq队列x:queue_job】:作业调度模块进程监听该队列,如果有消息,则fork子进程进行处理。该队列中的消息有3个来源,mq消息1(作业触发模块写入,触发作业流中的第一项任务)、mq消息2(作业调度进程写入,触发已记录还尚未执行的新任务)、mq消息3(任务执行模块写入异步任务的回复消息)
62.【mq队列y:queue_exe_req】:任务执行模块监听该队列,如果有消息,则执行消息中对应交易。
63.【mq队列z:queue_exe_rsp】:对于同步任务,任务执行结束后,执行模块将回复消息写入该队列。
64.【数据结构a-作业调度接口】:操作对象名、taskid(由作业调度模块sequence生成,每个任务有唯一的taskid。如果为空,则为作业流中的第一项任务)、jobno(作业编号)、回复内容(succ-成功、fail-失败、空-新任务)
65.【数据结构b-任务执行接口】:操作对象名、taskid、交易码、触发时间(yyyymmddhh24miss)
66.【表1-任务执行记录表】
67.说明:记录每个具体任务id、执行日期、时间、状态、操作对象、对应的作业编号和任务编号
68.字段:任务id(taskid,主键)、操作对象名、作业编号、任务编号、任务名称、开始时间、结束时间、任务执行状态(s-成功、f-失败、i-处理中)
69.样例:本实施例的操作对象为文本abc.xml
70.表1
[0071][0072]
【表2-作业计划表】
[0073]
说明:对不同作业配置所有需要执行的任务,任务分为同步和异步任务。对于同步任务,作业调度模块需等待执行结果;对于异步任务,触发执行后作业调度子进程退出,不占用系统资源。
[0074]
字段:作业编号、任务编号、任务名称、同异步标志、失败跳转任务编号;其中作业编号+任务编号为主键;任务如果执行成功,顺序执行下一任务,如果执行失败,新任务为失败跳转编号任务。
[0075]
样例:其中0001-文本拆分与0005-入账任务所需时间较长,所以设置为异步任务;若0001-文本拆分执行失败则跳转到0006-文本回复任务。
[0076]
表2
[0077]
作业编号任务编号任务名称同异步标志失败跳转任务编号job00010001文本拆分异步0006job00010002应答同步 job00010003缺失信息补录同步 job00010004类型识别同步 job00010005入账异步 job00010006文本回复同步 [0078]
【作业触发器】:写mq消息到【mq队列x:queue_job】,包括:操作对象名(文本名)、taskid(空,触发作业第一项任务,尚未生成taskid)、回复内容(空)
[0079]
【作业触发器】:常驻进程监听【mq队列x:queue_job】,如果有消息,则fork子进程进行处理。
[0080]
【作业触发器(子进程)】:解析mq消息,拆分出对象名、taskid、jobno、回复内容。
[0081]
(分支1)如果taskid为空,则根据jobno在【表2-作业计划表】中的第一项任务,生成新taskid,插入【表1-任务执行记录表】,写mq消息到【mq队列x:queue_job】。
[0082]
(分支2.2)如果taskid不为空,且在【表1-任务执行记录表】不存在相应任务,则视
为无效mq消息,退出子进程。
[0083]
(分支2.1.1)如果taskid不为空且在【表1-任务执行记录表】可以查询到相应任务,且mq消息是回复消息,则根据回复状态更新【表1-任务执行记录表】,在【表2-作业计划表】顺序查找下一执行任务(回复状态为成功),或从【表2-作业计划表】查找该任务的失败跳转任务(回复状态为失败),为新任务生成taskid,并将新任务相关信息插入【表1-任务执行记录表】,最后写mq消息到【mq队列x:queue_job】。
[0084]
(分支2.1.2.1)如果taskid不为空,在【表1-任务执行记录表】可以查询到相应任务,mq消息不是回复消息,且从【表2-作业计划表】查询到该任务(jobno+taskno)是同步执行任务,则写mq消息到【队列y:queue_exe_req】,包括:操作对象名、taskid、交易码、触发时间(yyyymmddhh24miss),并监听【队列z:queue_exe_rsp】,读取任务执行模块的回复。根据回复状态,更新【表1-任务执行记录表】,在【表2-作业计划表】顺序查找下一执行任务(回复状态为成功),或从【表2-作业计划表】查找该任务的失败跳转任务(回复状态为失败),为新任务生成taskid,并将新任务相关信息插入【表1-任务执行记录表】,最后写mq消息到【mq队列x:queue_job】。
[0085]
(分支2.1.2.2)如果taskid不为空,在【表1-任务执行记录表】可以查询到相应任务,mq消息不是回复消息,且从【表2-作业计划表】查询到该任务(jobno+taskno)是异步执行任务,则写mq消息到【队列y:queue_exe_req】,包括:操作对象名、taskid、交易码、触发时间(yyyymmddhh24miss),退出子进程。
[0086]
【任务执行】:常驻进程监听【mq队列y:queue_exe_req】,从消息中解析操作对象名、taskid、交易码等。根据交易码执行相应任务。并生成回复mq消息,同步交易则将消息写入【mq队列z:queue_exe_rsp】,否则写入【mq队列x:queue_job】
[0087]
说明:该模块执行的具体交易可以是c、java、shell脚本等,可扩展。
[0088]
本技术主要描述作业流实现方法,对具体执行的交易,不是本文的核心内容,此处不做详细描述;
[0089]
如果出现作业流异常中断,可通过外部程序在【mq队列x:queue_job】中重新写入消息,重新执行相应任务。该mq消息只需符合【数据结构a-作业调度接口】即可,对于外部程序的具体实现方式,可参照现有技术。
[0090]
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1