CN116841758A - 工作流任务处理方法、装置、计算机设备和存储介质 - Google Patents
工作流任务处理方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN116841758A CN116841758A CN202310802031.8A CN202310802031A CN116841758A CN 116841758 A CN116841758 A CN 116841758A CN 202310802031 A CN202310802031 A CN 202310802031A CN 116841758 A CN116841758 A CN 116841758A
- Authority
- CN
- China
- Prior art keywords
- workflow
- task
- instance
- sub
- execution
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000003860 storage Methods 0.000 title claims abstract description 29
- 238000003672 processing method Methods 0.000 title claims abstract description 23
- 238000012545 processing Methods 0.000 claims abstract description 229
- 238000000034 method Methods 0.000 claims abstract description 72
- 238000012216 screening Methods 0.000 claims abstract description 47
- 238000010195 expression analysis Methods 0.000 claims abstract description 28
- 230000006870 function Effects 0.000 claims description 91
- 238000012790 confirmation Methods 0.000 claims description 71
- 238000013507 mapping Methods 0.000 claims description 49
- 238000000547 structure data Methods 0.000 claims description 38
- 238000004590 computer program Methods 0.000 claims description 22
- 238000006243 chemical reaction Methods 0.000 claims description 11
- 230000008569 process Effects 0.000 description 27
- 238000010586 diagram Methods 0.000 description 21
- 230000002354 daily effect Effects 0.000 description 19
- 238000004519 manufacturing process Methods 0.000 description 18
- 230000003442 weekly effect Effects 0.000 description 15
- 238000007726 management method Methods 0.000 description 13
- 238000012544 monitoring process Methods 0.000 description 11
- 230000001960 triggered effect Effects 0.000 description 11
- 238000004891 communication Methods 0.000 description 8
- 238000013500 data storage Methods 0.000 description 7
- 230000007246 mechanism Effects 0.000 description 7
- 230000000903 blocking effect Effects 0.000 description 6
- 238000012217 deletion Methods 0.000 description 4
- 230000037430 deletion Effects 0.000 description 4
- 230000003203 everyday effect Effects 0.000 description 4
- 238000003780 insertion Methods 0.000 description 4
- 230000037431 insertion Effects 0.000 description 4
- 238000004458 analytical method Methods 0.000 description 3
- 239000002131 composite material Substances 0.000 description 3
- 238000010276 construction Methods 0.000 description 3
- 230000000737 periodic effect Effects 0.000 description 3
- 230000000750 progressive effect Effects 0.000 description 3
- 101100264195 Caenorhabditis elegans app-1 gene Proteins 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 230000001419 dependent effect Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000001914 filtration Methods 0.000 description 2
- 230000009191 jumping Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 238000012546 transfer Methods 0.000 description 2
- 239000002699 waste material Substances 0.000 description 2
- OKTJSMMVPCPJKN-UHFFFAOYSA-N Carbon Chemical compound [C] OKTJSMMVPCPJKN-UHFFFAOYSA-N 0.000 description 1
- 238000009825 accumulation Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 238000007405 data analysis Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000009826 distribution Methods 0.000 description 1
- 229910021389 graphene Inorganic materials 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000013439 planning Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000012384 transportation and delivery Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本申请涉及一种工作流任务处理方法、装置、设备和存储介质。所述方法包括:根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务,若检测到满足执行条件的工作流任务,根据与工作流任务对应的工作流任务数据创建工作流实例,从与工作流实例对应的工作流实例信息中筛选出与工作流实例关联的各子实例字段信息。对基于各子实例字段信息进行信息筛选所确定的任务参数信息和运行数据,进行表达式解析处理和执行数据替换处理,获得待执行的目标子任务,按照各目标子任务的执行时间和调用关系分别执行各目标子任务,在各目标子任务执行结束时获得工作流任务处理结果。采用本方法可对各工作流任务进行统一转换和并发执行,提升任务执行效率。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种工作流任务处理方法、装置、计算机设备、存储介质和计算机程序产品。
背景技术
随着计算机技术的发展,以及对不同业务的处理效率要求日益提升,出现了利用工作流自动执行业务处理流程的方式,即通过将多个业务过程或项目划分为多个工作任务,并将各工作任务按照一定顺序和规则执行,来优化业务处理流程,提升业务处理效率的方式。
传统上,将业务处理流程优化为统一的工作流进行执行的方式下,需要使用工作流引擎来执行不同的业务流程,即通常会将多个不同的业务系统接入一个工作流引擎,通过工作流引擎,为每个业务流程中的不同任务节点分配不同的服务处理资源,并在当前任务节点结束后,将服务处理资源回收,分配至其他任务节点,从而实现对整个业务流程的自动执行。
然而,传统的业务处理方式中,需要实时关注不同业务流程中任务节点的执行情况,以便及时回收相应的服务处理资源,且通常采用串行的方式,即当前任务节点未执行结束,不会同时触发执行其他任务节点,需要耗费较长的等待时间、以及服务资源回收时间,其任务处理效率仍然有待提升。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提升任务处理效率的工作流任务处理方法、装置、计算机设备、计算机可读存储介质和计算机程序产品。
第一方面,本申请提供了一种工作流任务处理方法。所述方法包括:
获取待处理工作流的时间配置信息,并根据所述时间配置信息将所述待处理工作流转换成携带时间属性的各工作流任务;
若检测到满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据,并创建与所述工作流任务数据对应的工作流实例;
获取与所述工作流实例对应的工作流实例信息,并从所述工作流实例信息中筛选出与所述工作流实例关联的各子实例字段信息;
基于各所述子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,对所述任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务;
按照各所述目标子任务的执行时间和调用关系分别执行各所述目标子任务,直至各所述目标子任务执行结束以获得工作流任务处理结果。
第二方面,本申请还提供了一种工作流任务处理装置。所述装置包括:
工作流任务转换模块,用于获取待处理工作流的时间配置信息,并根据所述时间配置信息将所述待处理工作流转换成携带时间属性的各工作流任务;
工作流实例创建模块,用于若检测到满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据,并创建与所述工作流任务数据对应的工作流实例;
子实例字段信息筛选模块,用于获取与所述工作流实例对应的工作流实例信息,并从所述工作流实例信息中,筛选出与所述工作流实例关联的各子实例字段信息;
目标子任务获得模块,用于基于各所述子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,对所述任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务;
目标子任务执行模块,用于按照各所述目标子任务的执行时间和调用关系分别执行各所述目标子任务,直至各所述目标子任务执行结束以获得工作流任务处理结果。
第三方面,本申请还提供了一种计算机设备。所述计算机设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取待处理工作流的时间配置信息,并根据所述时间配置信息将所述待处理工作流转换成携带时间属性的各工作流任务;
若检测到满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据,并创建与所述工作流任务数据对应的工作流实例;
获取与所述工作流实例对应的工作流实例信息,并从所述工作流实例信息中筛选出与所述工作流实例关联的各子实例字段信息;
基于各所述子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,对所述任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务;
按照各所述目标子任务的执行时间和调用关系分别执行各所述目标子任务,直至各所述目标子任务执行结束以获得工作流任务处理结果。
第四方面,本申请还提供了一种计算机可读存储介质。所述计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取待处理工作流的时间配置信息,并根据所述时间配置信息将所述待处理工作流转换成携带时间属性的各工作流任务;
若检测到满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据,并创建与所述工作流任务数据对应的工作流实例;
获取与所述工作流实例对应的工作流实例信息,并从所述工作流实例信息中筛选出与所述工作流实例关联的各子实例字段信息;
基于各所述子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,对所述任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务;
按照各所述目标子任务的执行时间和调用关系分别执行各所述目标子任务,直至各所述目标子任务执行结束以获得工作流任务处理结果。
第五方面,本申请还提供了一种计算机程序产品。所述计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
获取待处理工作流的时间配置信息,并根据所述时间配置信息将所述待处理工作流转换成携带时间属性的各工作流任务;
若检测到满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据,并创建与所述工作流任务数据对应的工作流实例;
获取与所述工作流实例对应的工作流实例信息,并从所述工作流实例信息中筛选出与所述工作流实例关联的各子实例字段信息;
基于各所述子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,对所述任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务;
按照各所述目标子任务的执行时间和调用关系分别执行各所述目标子任务,直至各所述目标子任务执行结束以获得工作流任务处理结果。
上述工作流任务处理方法、装置、计算机设备、存储介质和计算机程序产品中,通过获取待处理工作流的时间配置信息,并根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务,从而实现对待处理工作流下的各工作流任务进行统一转换、分配和执行。进一步地,若检测到满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据,并创建与工作流任务数据对应的工作流实例,进而可通过获取与工作流实例对应的工作流实例信息,以从工作流实例信息中筛选出与工作流实例关联的各子实例字段信息,从而可将工作流实例划分为多个子实例任务进行执行,提升任务处理效率。其中,通过从各子实例字段信息中筛选出与各子实例任务对应的任务参数信息和运行数据,从而可根据任务参数信息和运行数据进行表达式解析处理和执行数据替换处理,以获得待执行的目标子任务。进而通过按照各目标子任务的执行时间和调用关系分别执行各目标子任务,直至各目标子任务执行结束以获得工作流任务处理结果,实现了对各目标子任务的并发执行,而无需局限于传统串行执行方式,提升了任务执行效率,从而可准确、快速获得任务执行结果,减少资源消耗并提升资源利用效率。
附图说明
图1为一个实施例中工作流任务处理方法的应用环境图;
图2为一个实施例中工作流任务处理方法的流程示意图;
图3为一个实施例中将待处理工作流转换成携带时间属性的各工作流任务的流程示意图;
图4为一个实施例中通过连线方式构建待处理工作流的示意图;
图5为一个实施例中针对工作流触发器进行应用参数设置的示意图;
图6为一个实施例中单次任务的执行时间周期的设置示意图;
图7为一个实施例中执行时间周期为每分钟的设置示意图;
图8为一个实施例中执行时间周期为每小时的设置示意图;
图9为一个实施例中执行时间周期为每日的设置示意图;
图10为一个实施例中执行时间周期为每周的设置示意图;
图11为一个实施例中执行时间周期为每月的设置示意图;
图12为一个实施例中获取与工作流任务对应的工作流任务数据的流程示意图;
图13为一个实施例中执行目标子任务的流程示意图;
图14为一个实施例中基于任务消息队列读取子实例任务的示意图;
图15为一个实施例中与子实例编号关联的映射全局变量结构数据的示意图;
图16为另一个实施例中工作流任务处理方法的流程示意图;
图17为再一个实施例中工作流任务处理方法的流程示意图;
图18为一个实施例中工作流任务处理装置的结构框图;
图19为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请实施例提供的工作流任务处理方法,可以应用于如图1所示的应用环境中。其中,终端102通过网络与服务器104进行通信。数据存储系统可以存储服务器104需要处理的数据。数据存储系统可以集成在服务器104上,也可以放在云上或其他网络服务器上。其中,终端102可以但不限于是各种个人计算机、笔记本电脑、智能手机、平板电脑、物联网设备、便携式可穿戴设备以及飞行器等,物联网设备可为智能音箱、智能车载设备等。便携式可穿戴设备可为智能手表、智能手环、头戴设备等。服务器104可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等基础云计算服务的云服务器,终端102以及服务器104可以通过有线或无线通信方式进行直接或间接地连接,本申请实施例中不对此进行限制。
其中,终端102和服务器104均可单独用于执行本申请实施例中提供的工作流任务处理方法,终端102和服务器104也可以协同执行本申请实施例提供的工作流任务处理方法。举例来说,以终端102和服务器104协同执行本申请实施例提供的工作流任务处理方法为例,服务器104通过获取待处理工作流的时间配置信息,并根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务。若服务器104检测到满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据,并创建与工作流任务数据对应的工作流实例。其中,待处理工作流的时间配置信息以及工作流任务数据,可存储在服务器104的云端存储中、或数据存储系统中、或终端102的本地存储中,当需要进行工作流任务处理时,可从服务器104、或数据存储系统、或终端102中获取。
进一步地,服务器104通过获取与工作流实例对应的工作流实例信息,从工作流实例信息中筛选出与工作流实例关联的各子实例字段信息,并通过对各子实例字段信息进行信息筛选,可确定出与各子实例任务对应的任务参数信息和运行数据。进一步地,服务器104通过对任务参数信息和运行数据进行表达式解析处理和执行数据替换处理,可获得待执行的目标子任务,进而服务器104可按照各目标子任务的执行时间和调用关系分别执行各目标子任务,直至各目标子任务执行结束以获得工作流任务处理结果。其中,服务器104可进一步将所获得的工作流任务处理结果,反馈至终端102进行展示,或将每一目标子任务的执行结果进行存储,以供使用对象根据实际业务处理需求从各执行结果中进行查找、以及访问。
在一个实施例中,如图2所示,提供了一种工作流任务处理方法,以该方法应用于图1中的服务器为例进行说明,包括以下步骤:
步骤S202,获取待处理工作流的时间配置信息,并根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务。
其中,工作流包括按照一定的顺序和规则执行的多个任务(或处理步骤),可用于实现一个或多个业务过程或业务项目,而待处理工作流的时间配置信息则用于确定出待处理工作流中各工作流任务的执行时间点、以及执行时间周期等数据。
举例来说,某待处理工作流的时间配置信息包括“每周一的上午08:00:00执行任务1”,则可确定待处理工作流中“任务1”的执行时间点为“上午08:00:00”,执行时间周期为“每周一”,若需要确定出预设工作周期(比如未来一个月内)“任务1”的执行次数时,则可根据执行时间周期即“每周一”、以及预设工作周期即“一个月”,确定出一个月内“任务1”的执行次数为4次,执行时间点分别为未来一个月内每周一上午08:00:00。
同样地,由于待处理工作流通常包括对应不同的执行时间周期的多个工作流任务,具体可以是单次执行、每分钟执行、每小时执行、每日执行、每周执行以及每月执行的工作流任务,比如某待处理工作流的时间配置信息,还包括“每天上午10:00:00执行任务2”,则“任务2”的执行时间点为“上午10:00:00”,执行时间周期为“每天”,若需要确定出预设工作周期(比如未来一周内)“任务2”的执行次数时,则可根据执行时间周期即“每天”、以及预设工作周期即“一周”,确定出一周内“任务2”的执行次数为7次,执行时间点分别为未来一周内每天上午10:00:00。
具体地,通过获取待处理工作流的时间配置信息,根据时间配置信息确定与待处理工作流对应的执行时间周期,并在预设工作周期内,按照各执行时间周期将待处理工作流转换成携带时间属性的各工作流任务。
其中,时间属性具体可以理解为待处理工作流中各工作流任务的执行时间点、以及执行周期,而根据执行周期和预设工作周期,可确定出各工作流任务的具体执行次数,从而通过对待处理工作流进行转换处理,可获得待处理工作流中每个工作流任务在预设工作周期内每次执行时的时间点、以及具体执行次数,即转换得到的是携带详细的时间属性的各工作流任务。
步骤S204,若检测到满足执行条件的工作流任务,获取与工作流任务对应的工作流任务数据,并创建与工作流任务数据对应的工作流实例。
其中,满足执行条件可以理解为工作流任务的时间属性满足执行条件,具体可以是工作流任务的时间属性即执行周期和执行时间点和当前时间点匹配时,确定满足执行条件,比如某工作流任务的执行时间点为“周一上午10:00:00”,在检测到当前时间点同样为“周一上午10:00:00”时,则表明该工作流任务满足执行条件。
工作流任务数据可以理解为待处理工作流中各工作流任务的任务数据,具体包括工作流任务的编号(比如待处理工作流中某工作流任务的执行时间周期为每周,则在预设工作周期内比如一个月内,设置有4个工作流任务的任务编号,分别对应一个月内每周需执行的工作流任务)、执行时间点、执行次数、工作流任务所属的工作流编号、工作流名称、创建对象、创建时间以及工作流任务说明等数据。
工作流实例可以理解为需要完成当前的工作流任务所需要执行的实例,具体可以包括多个子实例,比如某一工作流实例用于实现“每周一上午08:00:00执行XX脚本文件”,则该工作流实例具体包括设置时间触发器的子实例、以及调用并执行XX脚本文件的子实例,而每个子实例分别各自对应一个子实例任务。其中,通过执行各子实例任务,则可完成当前的工作流任务,即通过执行配置时间触发器的子实例任务,并在满足时间触发器的执行时间点时调用并执行XX脚本文件的子实例任务,即可完成当前的工作流任务。
具体地,调用第一任务守护进程,基于存储有各工作流任务的任务数据库进行轮询处理,若检测到时间属性满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据,并调用工作流执行引擎创建与工作流任务数据对应的工作流实例。
其中,第一任务守护进程表示用于监测时间和轮询处理的任务守护进程,其实现原理是通过将计时器和循环机制进行结合,即通过设置用于定时执行轮询任务的计时器,在触发计时器时对存储有各工作流任务的任务数据库进行轮询处理,判断是否存在时间属性满足执行条件的工作流任务。进一步地,在经过预设间隔时间(即用于定时触发计时器而设置的预设时间间隔)后,再次开启计时器,继续对任务数据库进行轮询处理,判断是否存在时间属性满足执行条件的工作流任务。
也就是说,通过执行第一任务守护进程可不断地检查任务数据库中各工作流任务的任务数据,判断当前时间是否有工作流任务需要执行。其中,若检测到时间属性满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据。而若未检测到满足执行条件的工作流任务,则在经过预设时间间隔后再次进行轮询处理以判断当前时间是否有工作流任务需要执行。
举例来说,任务数据库中存储有不同待处理工作流对应的各工作流任务的任务数据,比如待处理工作流1包括工作流任务1以及工作流任务2,待处理工作流2包括工作流任务3和工作流任务4,则在任务数据库中存储各工作流任务的任务数据时,按照工作流任务的编号,将该工作流任务的执行时间点、执行次数、工作流任务所属的工作流编号、工作流名称、创建对象、创建时间以及任务说明等数据进行关联存储。
其中,任务数据库中存储的不同待处理工作流对应的各工作流任务的任务数据的数据表如下表1所示:
表1工作流任务的任务数据的数据表
进一步地,在获取与工作流任务对应的工作流任务数据之后,通过调用工作流执行引擎创建与工作流任务数据对应的工作流实例。其中,构建得到的工作流实例可以理解为需要完成当前的工作流任务所需要执行的实例,具体可以包括多个子实例。
在一个实施例中,在调用工作流执行引擎创建与工作流任务数据对应的工作流实例时,具体是通过调用工作流执行引擎,在工作流运行数据库中创建记录有工作流任务的任务编号、工作流编号、任务名称、执行对象、执行状态(比如未执行、执行中、以及执行结束等状态)、开始时间、结束时间、以及各子实例执行之间的流程关系的执行记录数据表。
进一步地,根据执行记录数据表、以及执行记录数据表中各字段的实际字段内容,比如任务编号的字段内容为“100001”、工作流编号的字段内容为“20002”、执行状态的字段内容为“未执行”、以及流程关系的字段内容为“第一跳子任务实例1-时间触发器、下一跳子任务实例2-执行XX脚本”等,得到与工作流任务数据对应的工作流实例。
具体来说,与工作流任务对应的执行记录数据表如下表2所示:
表2与工作流任务对应的执行记录数据表
其中,“apps”字段用于存储各子实例执行之间的流程关系,则执行工作流任务时,工作流执行引擎具体是按照各子实例执行之间的流程关系,依次执行各子实例,比如流程关系的字段内容为“第一跳子任务实例1-时间触发器、下一跳子任务实例2-执行XX脚本”时,则具体是先执行第一跳子任务实例1,创建时间触发器,再执行下一跳子任务实例2,调用并执行XX脚本。
在一个实施例中,“apps”字段中所存储的各子实例执行之间的流程关系,具体可采用DSLJson格式(即Domain Specific Language JavaScript Object Notation,表示为特定领域设计的、具有受限表达性的数据交换格式)的流程数据结构进行表示。
其中,以某一工作流用于实现“每周一上午08:00:00执行XX脚本文件”为例,该工作流对应的“apps”字段中所存储的各子实例执行之间的流程关系,采用以下表3所示的DSLJson格式的流程数据结构表进行表示:
表3“apps”字段对应的DSLJson格式的流程数据结构表
其中,参照表3可知,用于实现“每周一上午08:00:00执行python脚本文件”的工作流,其名字即name为“测试工作流”,具体包括:实例名字为“时间触发器”的子实例,其实例ID(即任务编号)为“sys-6275-026193”,该子实例的目的在于执行时间触发器配置的任务,该子实例中时间触发器的具体配置信息为“{"参数值":"每周#008**1"}”,其调用的应用模板数据为“timer-trigger”,即计时触发器,输出为“XXX”,即通过执行该子实例会得到与该子实例对应的输出结果。
进一步地,该工作流还包括实例名字为“python脚本执行”的子实例,该子实例作为“时间触发器”的子实例的下一跳实例,即在该工作流中执行配置时间触发器的子实例后,跳转至执行“python脚本执行”的子实例。其中,“python脚本执行”的子实例,其实例ID(即任务编号)为“sys-52-076123”,该子实例中的具体参数信息为“"参数值":"importsys\nprint(sys.argv)"”,理解为python脚本的执行命令,包括输入命令“importsys”和输出命令“nprint”,用于在执行XX脚本时获取输入数据、以及在执行结束后输出执行结果,其调用的应用模板数据为“python-script”即python脚本的应用模板数据,该子实例的输出为“XXX”,即通过执行该子实例调用并执行python脚本后,会得到与该子实例对应的输出结果。
步骤S206,获取与工作流实例对应的工作流实例信息,并从工作流实例信息中筛选出与工作流实例关联的各子实例字段信息。
其中,与工作流实例对应的工作流实例信息具体包括工作流实例对应的工作流名称、工作流实例所属的工作流编号、工作流包括的各子实例的实例名称、执行状态(比如未执行、执行中、以及执行结束等状态)、开始时间、结束时间、以及各子实例执行之间的流程关系等数据。
具体地,通过获取与工作流实例对应的工作流实例信息,包括工作流实例对应的工作流名称、工作流实例所属的工作流编号、工作流包括的各子实例的实例名称、子实例的参数配置信息、执行状态(比如未执行、执行中、以及执行结束等状态)、开始时间、结束时间、以及各子实例执行之间的流程关系等数据,并基于工作流实例信息进行信息筛选,识别并筛选出工作流实例包括的各子实例、各子实例的参数配置信息以及各子实例的前后跳转关系(比如当前某子实例的前一跳子实例、以及后一跳子实例),即得到与工作流实例关联的各子实例字段信息。
步骤S208,基于各子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,对任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务。
具体地,基于工作流实例信息进行字段识别处理,可获得与工作流实例信息关联的各关键字段,其中,关键字段具体包括工作流实例对应的工作流名称字段、工作流实例所属的工作流编号字段、工作流包括的各子实例的实例名称字段、以及各子实例执行之间的流程关系字段等。其中,基于各子实例执行之间的流程关系字段,可进一步确定各子实例的参数配置信息、应用模板数据、执行状态、开始时间、结束时间以及报错信息等信息。
其中,在获得与工作流实例信息关联的各关键字段后,进一步对各关键字段进行字段筛选处理,以从各关键字段中筛选出流程关系字段,并获取与流程关系字段对应的子实例字段信息。其中,流程关系字段具体可以理解为各子实例执行之间的流程关系,而基于流程字段可进一步确定出各子实例的参数配置信息、应用模板数据、执行状态、开始时间、结束时间以及报错信息等数据,则与流程关系字段对应的子实例字段信息,具体可以包括子实例的实例名称、各子实例的参数配置信息、应用模板数据、执行状态、开始时间、结束时间以及报错信息等数据。
进一步地,对子实例字段信息进行进一步筛选时,可基于各子实例字段信息筛选出与各子实例任务对应的任务参数信息和运行数据。其中,任务参数信息即可理解为各子实例的参数配置信息,运行数据则具体包括各子实例的应用模板数据、执行状态、开始时间、结束时间以及报错信息等。
在一个实施例中,在确定出与各子实例任务对应的任务参数信息和运行数据之后,进一步对任务参数信息进行表达式解析处理以解析得到对应的路径语法表达式,并根据运行数据对路径语法表达式进行数据替换处理,以替换得到携带运行数据的待执行的目标子任务。
其中,任务参数信息即子实例的参数配置信息,具体采用<参数key,参数value,参数类型,参数描述>的方式进行表示。其中,参数key表示参数名称,参数value表示参数的具体参数内容,参数value可以是常量(比如数字或者字符串),也可以是使用路径语法表达式引用前面任意一个子实例的输出结果。参数类型指的是参数的数据类型,具体可以是string(字符串)、boolean(布尔类型)、以及number(数字)的类型,参数描述表示与配置参数对应的其他注释信息,比如对参数的类型和约束进行进一步描述和解释。
进一步地,参数value是使用路径语法表达式引用前面任意一个子实例的输出结果时,则需要对任务参数信息进行表达式解析处理以解析得到对应的路径语法表达式,进而通过利用运行数据对路径语法表达式进行数据替换处理,从而在通过数据替换处理后使得相应子实例中包括实际执行时所需的具体运行数据,即得到的是携带运行数据的待执行的目标子任务。
其中,在需要获取当前参数的参数value时,若涉及多个层级或者多个存储路径套用的情况,比如存在当前子实例的参数的参数valve是上一跳子实例的输出结果,而上一跳子实例的参数是前面某一跳子实例的输出结果时,即存在多个层级或多个存储路径套用的情况,类似于需要获取某个文件夹中的文本文件,而该文件夹之上还嵌套有多个其他文件夹时,则需要获得所嵌套的每个文件夹的文件夹名称得到该文本文件的访问路径,进而基于访问路径进行层层递进访问以获得所需的文本文件的情况。
具体到本申请实施例中,举例来说,当前子实例的参数value是使用路径语法表达式引用前面任意一个子实例的输出结果时,采用以下路径语法表达式(1)进行表示:
{{<子实例ID1>.data}}
{{<子实例ID2>.parameter.<参数key值>}} (1)
其中,上述路径语法表达式(1)中,子实例“ID2”的“parameter”即入参数组中的参数key值(即参数value),是子实例“ID1”的“data”即输出结果,则通过对路径语法表达式(1)进行解析,并获取子实例“ID1”的输出结果“XXX”,通过将子实例“ID2”的参数key值(即参数value)替换为输出结果“XXX”,则获得执行子实例“ID2”时的实际参数key值,获得可直接执行的、携带运行数据的目标子任务。
在一个实施例中,在获取与流程关系字段对应的子实例信息之后,方法还包括:
初始化子实例信息中各子实例任务的数据状态,并将初始化后的子实例任务依次存储至任务消息队列中;调用与任务消息队列关联的第二任务守护进程,按照执行时间依次从任务消息队列中读取子实例任务,并更新子实例任务对应的数据状态。
具体地,在获取与流程关系字段对应的子实例信息之后,进一步对子实例信息中各子实例任务的数据状态进行初始化,具体是初始化成为“未处理”或“待处理”的状态,即表明当前子实例信息对应的子实例任务为待处理。其中,通过建立用于存储子实例任务的任务消息队列,将所获得的子实例任务依次存储至任务消息队列中。同时,通过获取工作流中的起始节点(即起始子实例)即时间触发器的子实例,并通过执行时间触发器的子实例以按照子实例任务的前后跳转关系,比如按照起始子实例、下一跳子实例、第三跳子实例……等各子实例之间的前后跳转关系,依次将所获得的子实例任务依次存储至任务消息队列中。
其中,与任务消息队列关联的第二任务守护进程具体运行于工作流执行引擎中的不同容器(具体可以是docker容器,属于轻量级的虚拟化容器,可通过构建自定义的Docker镜像来打包应用程序和它的所有依赖项,然后将镜像直接部署到生产环境上)中,通过运行第二任务守护进程以实时检测任务消息队列中是否存在可执行的子实例任务,若检测到任务消息队列中存在子实例任务则依次从任务消息队列中读取子实例任务,并更新子实例任务对应的数据状态(具体是将子实例任务的数据状态设置为处理中),从而可将当前处理中的子实例任务和未处理(或待处理)的子实例任务区分开,避免出现重复执行、或漏执行子实例任务的情况。
进一步地,针对数据状态更新后的各子实例任务,即状态数据为处理中的各子实例任务,获取该些子实例任务对应的子实例字段信息,并通过对子实例字段信息进行信息筛选以确定出与子实例任务对应的任务参数信息和运行数据。其中,任务参数信息即可理解为各子实例的参数配置信息,运行数据则具体包括各子实例的执行状态、应用模板数据、开始时间、结束时间以及报错信息等。
步骤S210,按照各目标子任务的执行时间和调用关系分别执行各目标子任务,直至各目标子任务执行结束以获得工作流任务处理结果。
具体地,目标子任务为携带执行实际所需的运行数据的子任务,则可按照目标子任务的执行时间和调用关系将各目标子任务依次推送至子任务消息队列中,并基于子任务消息队列依次读取并执行各目标子任务,直至各目标子任务执行结束以获得工作流任务处理结果。
其中,通过设置子任务消息队列,可将各目标子任务按照执行时间和调用关系(即前后跳转关系)依次推送至子任务消息队列中,从而利用子任务消息队列实现先进先出的目的,保障各目标子任务的准确执行,避免出现同时目标子任务遗漏执行的情况出现。
同样地,采用基于子任务消息队列依次读取并执行各目标子任务的方式,可保障各目标子任务按照工作流的流程关系准确执行,直至各目标子任务执行结束以获得工作流任务处理结果。
在一个实施例中,在执行各目标子任务的过程中,每个目标子任务各自对应子任务执行结果,即在确定工作流处理完成时,可获得实现该工作流所需要执行的各目标子任务的子任务执行结果。其中,通常是将最后执行的目标子任务的子任务执行结果作为工作流任务处理结果进行输出和展示,而根据实际业务需求,使用对象也可基于各目标子任务的子任务执行结果进行查询和访问,获得符合实际业务需求的子任务执行结果。
进一步地,执行各目标子任务的过程,具体包括:通过对目标子任务对应的运行数据进行解析,以获得与目标子任务对应的应用模板数据,其中,应用模板数据用于决定该目标子任务的具体运行逻辑,即具体是需要调用哪个功能函数作为当前目标子任务的运行逻辑,而参数字段是功能函数运行时所需的具体参数,则在目标子任务运行过程中,需要解析目标子任务对应的参数信息以获得参数信息中包括的各参数字段、以及各参数字段对应的参数内容(即参数value,具体可以是数值或字符串等)。
其中,目标子任务的运行过程可以理解为将参数字段中的参数内容传入应用模板数据对应的功能函数后,通过执行已传入参数内容的功能函数以将获得功能函数的执行结果并输出,即输出得到该目标子任务对应的子任务执行结果。
同样地,执行完当前的目标子任务后,根据执行时间和调用关系(即前后跳转关系)确定出当前目标子任务的下一跳目标子任务,并执行下一跳目标子任务,依次类推,直至将各目标子任务均执行完,即确定当前工作流处理完成。
在一个实施例中,在获得子任务执行结果后,还包括:
根据子任务执行结果生成确认信息,将确认信息依次存储至确认信息队列中;基于确认信息队列依次读取与各目标子任务对应的确认信息,并根据确认信息对工作流实例信息中的任务状态数据进行更新;其中,若确定工作流实例信息中的任务状态数据均更新,确定各目标子任务执行结束。
具体地,根据子任务执行结果生成确认信息时,具体是生成目标子任务执行结束的信息,而执行结束的信息用于表明该目标子任务执行完毕,进而可根据是否生成确认信息(即执行结束的信息)确定各目标子任务的执行状态,以避免出现重复执行造成服务资源浪费的情况。
进一步地,通过建立确认信息队列,将各确认信息按照确认信息的生成时间依次存储至确认信息队列中,并基于确认信息队列依次读取与各目标子任务对应的确认信息,从而达到保障确认信息是先进先出的状态,避免出现由于确认信息混乱导致无法准确根据确认信息对工作流实例信息中的任务状态数据进行更新的问题。
其中,通过利用确认信息对工作流实例信息中的任务状态数据进行更新,并在确定工作流实例信息中的任务状态数据均更新时,即完成了对各目标子任务的执行时,确定各目标子任务执行结束,完成对当前工作流的处理以获得相应的工作流处理结果。
上述工作流任务处理方法中,通过获取待处理工作流的时间配置信息,并根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务,从而实现对待处理工作流下的各工作流任务进行统一转换、分配和执行。进一步地,若检测到满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据,并创建与工作流任务数据对应的工作流实例,进而可通过获取与工作流实例对应的工作流实例信息,以从工作流实例信息中筛选出与工作流实例关联的各子实例字段信息,从而可将工作流实例划分为多个子实例任务进行执行,提升任务处理效率。其中,通过对各子实例字段信息进行信息筛选以确定出与各子实例任务对应的任务参数信息和运行数据,从而可根据任务参数信息和运行数据进行表达式解析处理和执行数据替换处理,以获得待执行的目标子任务。进而通过按照各目标子任务的执行时间和调用关系分别执行各目标子任务,直至各目标子任务执行结束,以获得工作流任务处理结果,实现了对各目标子任务的并发执行,而无需局限于传统串行执行方式,提升了任务执行效率,从而可准确、快速获得任务执行结果,减少资源消耗并提升资源利用效率。
在一个实施例中,如图3所示,将待处理工作流转换成携带时间属性的各工作流任务的步骤,即获取待处理工作流的时间配置信息,并根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务的步骤,具体包括:
步骤S302,若检测到工作流任务处理请求,获取与工作流任务处理请求对应的待处理工作流以及待处理工作流携带的时间配置信息。
具体地,若检测到基于工作流管理平台触发的工作流任务处理请求,则获取与工作流处理请求对应的待处理工作流。其中,基于工作流管理平台触发工作流任务处理请求时,具体是基于工作流管理平台采用拖拽连线的方式构建与工作流任务处理请求对应的待处理工作流,并进一步获取待处理工作流携带的时间配置信息。
其中,待处理工作流的时间配置信息用于确定出待处理工作流中各工作流任务的执行时间点、以及执行时间周期等数据,比如某待处理工作流的时间配置信息包括“每周二的上午09:00:00执行任务3”,则可确定待处理工作流中“任务3”的执行时间点为“上午09:00:00”,执行时间周期为“每周二”,若需要确定出预设工作周期(比如未来一个月内)“任务3”的执行次数时,则可根据执行时间周期即“每周二”、以及预设工作周期即“一个月”,确定出一个月内“任务3”的执行次数为4次,执行时间点分别为未来一个月内每周二上午09:00:00。
进一步地,如图4所示,提供了一种通过连线方式构建待处理工作流的方式,参照图4可知,基于工作流管理平台采用拖拽连线的方式构建包括“时间触发器”的子实例、以及和“时间触发器”的子实例通过连线方式连接的“执行Python脚本”的子实例,得到的是用于实现“每周一上午08:00:00执行一个Python脚本”的工作流。
其中,通过连线方式可确定工作流中不同子实例之间的前后跳转关系,即具体是需要先执行“时间触发器”的子实例,即在设置“每周一上午08:00:00”的时间配置信息后,再跳转执行“执行Python脚本”的子实例,以实现执行“每周一上午08:00:00执行一个Python脚本”的工作流的目的。
在一个实施例中,如图5所示,提供了一种针对工作流触发器进行应用参数设置的过程,参照图5可知,针对工作流触发器进行应用参数设置时,该设置执行周期的子实例名称为“时间触发器”,该子实例的任务编号为“sys-6275-026193”,在设置执行时间时可选择不同的任务类型(包括单次任务、每分钟执行任务、每小时执行任务、每日执行任务、每周执行任务、以及每月执行任务等),并根据任务类型进一步设置具体执行时间点。
举例来说,参照图5可知,若选择的任务类型为“每周执行任务”,则可选择具体是周几比如周三,则在选择“周三”后进一步设置详细执行时间点,比如“上午06:00:00”,即设置执行时间点时需要精准到到时、分、秒,从而实现对工作流中满足执行时间点的子实例任务的准确、快速执行。
其中,“时间触发器”的子实例的应用参数,还包括应用说明,参照图5可知,该子实例的应用说明为“可设置定时任务或周期性任务。注意:在启用工作流后会立即创建定时/周期任务,当不启用工作流,则会删除对应的定时任务和周期任务”,也就是说,通过设置“时间触发器”,并启用工作流,进而可在满足时间触发器的触发条件时执行在工作流中满足时间触发器对应的执行时间点的子实例。
在一个实施例中,在通过连线方式构建待处理工作流,并针对待处理工作流中的子实例,比如“时间触发器”的子实例、以及和“时间触发器”的子实例通过连线方式连接的“执行Python脚本”的子实例,进行应用参数(或配置参数)设置后,将构建的工作流及其对应的应用参数关联保存,可通过配置接口将工作流及其应用参数传入服务器后台的任务调度中心进行存储。
其中,工作流及其应用参数具体可以采用DSLJson格式的流程数据结构进行存储,用于实现“每周一上午08:00:00执行python脚本文件”的工作流,其应用参数信息如下表4所示的工作流应用参数的流程数据结构表所示:
表4工作流应用参数的流程数据结构表
其中,参照表4可知,用于实现“每周一上午08:00:00执行python脚本文件”的工作流,其名字即name为“测试工作流”,具体包括:实例名字为“时间触发器”的子实例,其实例ID(即任务编号)为“sys-6275-026193”,该子实例的目的在于执行时间触发器配置的任务,该子实例中时间触发器的具体配置信息为“{"参数值":"每周#008**1"}”,具体可以理解为“每周一上午08:00:00”,其调用的应用模板数据为“timer-trigger”即计时触发器。其中,由于“时间触发器”的子实例为起始子实例,则该子实例不存在上一跳实例,对应表4中“"上一跳实例ID":[],”的内容,即上一跳实例为空。
进一步地,参照表4可知,该工作流还包括实例名字为“python脚本执行”的子实例,该子实例作为“时间触发器”的子实例的下一跳实例,即在该工作流中执行配置时间触发器的子实例后,跳转至执行“python脚本执行”的子实例。可以理解的是,针对“python脚本执行”的子实例,其上一跳实例为“时间触发器”的子实例,即对应表4中“"上一跳实例ID":["sys-6275-026193"]”的内容。
其中,针对“python脚本执行”的子实例,其实例ID(即任务编号)为“sys-52-076123”,该子实例中的具体参数信息为“"参数值":"importsys\nprint(sys.argv)"”,理解为python脚本的执行命令,包括输入命令“importsys”和输出命令“nprint”,用于在执行XX脚本时获取输入数据、以及在执行结束后输出执行结果,其调用的应用模板数据为“python-script”即python脚本的应用模板数据。
同样地,由于在该工作流中在执行“python脚本执行”的子实例之后,并不存在其他需要执行的子实例,即“python脚本执行”的子实例不存在下一跳实例,具体和表4中“下一跳实例ID":[]”(即下一跳实例为空)的内容对应。
步骤S304,根据时间配置信息确定与待处理工作流对应的执行时间周期。
具体地,服务器后台的任务调度中心接收并存储有大量待处理工作流、以及与各待处理工作流关联存储的应用参数,即每个待处理工作流分别对应各自的“时间触发器”子实例、以及针对“时间触发器”子实例进行参数配置得到的时间配置信息,进而具体是根据每个待处理工作流对应的时间配置信息确定待处理工作流对中各子实例的执行时间周期。
其中,在确定出待处理工作流对中各子实例的执行时间周期后,进一步预测得到待处理工作流中各子实例在预设工作周期中执行次数、以及每次执行的具体执行时间点,从而将待处理工作流转换成基于时间戳(即时间属性)的任务(即子实例任务),并将转换得到的各任务存储在任务数据库中。
步骤S306,在预设工作周期内,按照各执行时间周期将待处理工作流转换成携带时间属性的各工作流任务,携带时间属性的工作流任务为在不同时间点重复执行的工作流任务。
具体地,根据执行时间周期确定待处理工作流在预设工作周期内的执行次数,并基于执行时间周期和执行次数确定待处理工作流每次执行的时间点,进而可将待处理工作流每次执行的时间点以及执行时间周期确定为待处理工作流的时间属性,从而得到携带时间属性的各工作流任务。
其中,在确定出待处理工作流对中各子实例的执行时间周期后,进一步根据执行时间周期预测得到待处理工作流中各子实例在预设工作周期中执行次数。比如,针对“每周一上午08:00:00执行python脚本文件”的工作流,若该工作流创建时间为“20XX-04-21-16:30:00”,针对“每周一上午08:00:00”的时间触发器子实例,其执行时间周期即“每周一”、以及预设工作周期比如“未来7周内”,确定该工作流的执行次数为7次,进而可基于执行时间周期和执行次数确定待处理工作流每次执行的时间点每次执行的具体执行时间点,即根据创建时间、执行时间周期以及执行次数确定出该工作流未来7次的执行时间点,即达到将待处理工作流转换成基于执行时间点的任务的目的。
举例来说,以“每周一上午08:00:00执行python脚本文件”的工作流,若该工作流创建时间为“20XX-04-21-16:30:00”,预设工作周期为“未来7周内”为例,确定该工作流未来7次的执行时间点如下表5所示:
表5某工作流在预设工作周期内未来7次的执行时间表
时间点 | |
创建 | 20XX-04-21-16:30:00 |
第一次运行 | 20XX-04-24-08:00:00 |
第二次运行 | 20XX-05-01-08:00:00 |
第三次运行 | 20XX-05-08-08:00:00 |
第四次运行 | 20XX-05-15-08:00:00 |
第五次运行 | 20XX-05-22-08:00:00 |
第六次运行 | 20XX-05-29-08:00:00 |
第七次运行 | 20XX-06-05-08:00:00 |
在一个实施例中,任务类型具体包括:单次任务、每分钟执行任务、每小时执行任务、每日执行任务、每周执行任务、以及每月执行任务等,则对各待处理工作流在预设执行工作周期内(比如未来一年内)的执行时间点进行预测时,需要对所有的单次任务、每分钟执行任务、每小时执行任务、每日执行任务、每周执行任务以及每月执行任务等在未来一年内的执行时间点进行预测后,将相应待处理工作流转换成携带执行时间点的任务,存储在任务数据库中。
其中,在任务数据库中存储各工作流任务的任务数据时,按照工作流任务的编号,将该工作流任务的执行时间点、执行次数、工作流任务所属的工作流编号、工作流名称、创建对象、创建时间以及任务说明等数据进行关联存储。
在一个实施例中,如图6所示,提供了一种单次任务的执行时间周期的设置示意图,参照图6可知,若选定的任务类型为“单次任务”,则需要针对单次任务设置其执行时间点,比如设置其执行时间点为“20XX-04-21-18:00:00”,以在确定在达到所设置的执行时间点时执行该单次任务,并在执行该单次任务后即确定执行完毕,不对该单次任务进行重复执行。
在一个实施例中,如图7所示,提供了一种执行时间周期为每分钟的设置示意图,参照图7可知,若选定的任务类型为“每分钟执行任务”,其执行周期为每分钟,则需要进一步设置秒数即精确设置到是每分钟的哪一秒触发执行该待处理工作流中的任务,比如设置执行时间点为“每分钟第03秒”,若预设工作周期为10分钟,则在10分钟中每分钟第03秒均需要执行该工作流中的任务,即在未来10分钟内需要执行10次该工作流中的任务。
进一步地,如图8所示,提供了一种执行时间周期为每小时的设置示意图,参照图8可知,若选定的任务类型为“每小时执行任务”,其执行周期为每小时,则需要进一步设置具体的分秒数即精确设置到是每小时的哪一分钟的哪一秒触发执行该待处理工作流中的任务,比如设置执行时间点为“每小时的第10分10秒”,若预设工作周期为3小时,则在未来3小时中每小时的第10分10秒均需要执行该工作流中的任务,即在未来3小时内需要执行3次该工作流中的任务。
在一个实施例中,如图9所示,提供了一种执行时间周期为每日的设置示意图,参照图9可知,若选定的任务类型为“每日执行任务”,其执行周期为每天,则需要进一步设置具体的时分秒数即精确设置到是每天的哪一小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每日02:00:00”,若预设工作周期为一周,则在未来一周中每天的第02时00分00秒均需要执行该工作流中的任务,即在未来一周内需要执行7次该工作流中的任务。
进一步地,如图10所示,提供了一种执行时间周期为每周的设置示意图,参照图10可知,若选定的任务类型为“每周执行任务”,其执行周期为每周,则需要进一步设置具体的日时分秒数,即精确设置到是每周的哪一天的哪一小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每周三06:00:00”,若预设工作周期为一个月,则在未来一个月中每周三的第06时00分00秒均需要执行该工作流中的任务,即在未来一个月内需要执行4次该工作流中的任务。
同样地,如图11所示,提供了一种执行时间周期为每月的设置示意图,参照图11可知,若选定的任务类型为“每月执行任务”,其执行周期为每月,则需要进一步设置具体的日时分秒数,即精确设置到是每个月的哪一天的哪一小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每月第4日的04:00:00”,若预设工作周期为3个月,则在未来3个月中每月的第四日的第04时00分00秒均需要执行该工作流中的任务,即在未来3个月内需要执行3次该工作流中的任务。
本实施例中,若检测到工作流任务处理请求,则获取与工作流任务处理请求对应的待处理工作流,并获取待处理工作流携带的时间配置信息。进一步地,通过根据时间配置信息确定与待处理工作流对应的执行时间周期,并在预设工作周期内,按照各执行时间周期将待处理工作流转换成携带时间属性的各工作流任务,即得到可在预设工作周期内的不同时间点重复执行的工作流任务,从而可实现对待处理工作流下的各工作流任务进行统一转换、分配和执行,而无需局限于传统串行执行方式,可同时对多个待处理工作流中的各任务进行统一分配和执行,实现对多个待处理工作流的并发执行,提升了实际的工作流处理过程中的任务执行效率。
在一个实施例中,如图12所示,获取与工作流任务对应的工作流任务数据的步骤,即若检测到时间属性满足执行条件的工作流任务,获取与工作流任务对应的工作流任务数据的步骤,具体包括:
步骤S1202,基于任务数据库进行工作流任务筛选,将时间属性与当前执行时间点匹配的各工作流任务确定为满足执行条件的工作流任务。
具体地,通过调用第一任务守护进程,基于存储有各工作流任务的任务数据库进行轮询处理和工作流任务筛选处理,以从任务数据库中筛选出时间属性与当前执行时间点匹配的各工作流任务,进一步将所筛选出的各工作流任务确定为满足执行条件的工作流任务。
其中,第一任务守护进程表示用于监测时间和轮询处理的任务守护进程,其实现原理是通过将计时器和循环机制进行结合,即通过设置用于定时执行轮询任务的计时器,在触发计时器时对存储有各工作流任务的任务数据库进行轮询处理,判断是否存在时间属性满足执行条件的工作流任务。进一步地,在经过预设间隔时间(即用于定时触发计时器而设置的预设时间间隔)后,再次开启计时器,继续对任务数据库进行轮询处理以判断是否存在时间属性满足执行条件的工作流任务。
步骤S1204,获取满足执行条件的各工作流任务对应的任务信息,并根据任务信息生成工作流任务数据。
具体地,在确定出满足执行条件的各工作流任务后,进一步获取各工作流任务对应的任务信息,以根据任务信息来触发生产任务和消费任务,其中,生产任务用于根据任务信息生成工作流任务数据,而消费任务用于读取并消费工作流任务数据。
进一步地,生产任务和消费任务是通过消息队列的方式来实现,而消息队列具体可以是Redis消息队列(Redis消息队列指的是基于Redis数据存储的消息传递系统,用于可以实现生产者和消费者之间的异步通信,从而提高系统的并发性和可扩展性),且Redis消息队列支持多个消费者同时取出消息,当多个消费者同时从List的尾部取出消息时,每个消息只能被一个消费者处理,即如果一个消息被消费者A处理,则其他消费者无法再处理这个消息,进而可通过利用Redis消息队列支持多个消费者同时取出消息的特性让工作流的执行实现集群化处理、以及并发处理,提升工作流的执行处理效率。
其中,Redis消息队列具体是使用基于Redis的List数据结构(即支持在列表的两端插入和删除元素双向链表结构)来存储消息,生产者和消费者是两个独立的进程,它们通过Redis服务器进行通信,生产者通过LPUSH命令(即用于将一个或多个值插入到列表key的头部的命令),将消息插入到List的头部,消费者则通过RPOP命令(即用于移除并返回列表key的最后一个元素的命令)从List的尾部取出消息,进而可通过Redis消息队列保证消息的顺序,实现先进先出的功能。
在一个实施例中,在消费者从Redis消息队列中取出消息后,利用ACK机制(即Acknowledge消息确认机制)对消息进行确认,以避免消息丢失,即当消费者读取出一条消息后,需要向Redis服务器发送ACK命令以确认该条消息已经被处理,Redis服务器会将这条消息从List中删除,而如果消费者没有发送ACK命令,则Redis服务器会认为这条消息未被处理,会在下次取出消息时再次返回。
进一步地,Redis消息队列还提供了超时机制,当消费者取出一条消息后,如果在预先设置的超时时间内没有发送ACK命令,Redis服务器会将这条消息重新插入到List的尾部,等待下一次被取出。其中,超时时间具体是通过expire命令(即用于给指定的关联数据设置过期时间的命令)来实现。
步骤S1206,创建消息队列,并根据与消息队列关联的第一处理指令,将各工作流任务数据按照存储规则依次存储至消息队列中。
其中,消息具体可以是Redis消息队列,而Redis消息队列具体可以通过利用List数据结构(即支持在列表的两端插入和删除元素双向链表结构)来实现。
具体地,通过创建Redis消息队列,并利用Redis消息队列存储各工作流任务数据。其中,与消息队列关联的第一处理指令,具体可以包括LPUSH命令(即用于将一个或多个值插入到列表key的头部的命令),即通过LPUSH命令将工作流任务数据插入到队列的左端(即头部)。
举例来说,“LPUSH orders_queue order1”命令,用于将工作流任务数据order1插入至队列orders_queue的左端。
步骤S1208,根据与消息队列关联的第二处理指令,按照读取规则依次从消息队列中读取工作流任务数据。
其中,与消息队列关联的第二处理指令具体可以包括BRPOP命令(即列表的阻塞式弹出命令,会导致阻塞,直到队列中有数据可读取,而一旦有数据可读取,会返回从队列中读取到的工作流任务数据)。
具体地,通过使用BRPOP命令,按照读取规则(即先进先出的规则)从队列的右端读取工作流任务数据。其中,执行BRPOP命令时会导致阻塞,即若消息队列中不存在可读取的工作流任务数据时不会执行后续操作,直到队列中有数据可读取,而一旦有数据可读取,BRPOP命令会返回从队列中读取到的工作流任务数据。
举例来说,“BRPOP orders_queue()”命令用于从消息队列orders_queue的右端读取工作流任务数据、且在消息队列orders_queue中不存在可读取的工作流任务数据时,出现堵塞,直至消息队列orders_queue中有数据可读取,并在有数据可读取时返回从队列中读取到的工作流任务数据。
在一个实施例中,在从消息队列中读取工作流任务数据后,还需调用工作流执行引擎创建与工作流任务数据对应的工作流实例,并在执行工作流实例对应的各目标子任务后,根据子任务执行结果生成确认信息,并将确认信息依次存储至所构建的确认信息队列中。
其中,具体可以采用RPUSH命令(即用于向存储在key中的列表的尾部插入所有指定的值的命令)将确认信息插入到队列的右端。举例来说,“RPUSH orders_queue_processed order2”命令,用于将确认信息order2插入确认信息队列orders_queue_processed的右端。
在一个实施例中,针对消息队列的状态,即对队列中待处理的工作流任务数据的数量的状态监测,通过LLEN命令(即通过获取队列中未处理的工作流任务数据数量来返回队列长度的命令)实现。举例来说,“LLEN orders_queue”命令,用于返回消息队列orders_queue的队列长度,以到达获取消息队列中未处理的工作流任务数据数量的目的。
本实施例中,通过将在任务数据库中时间属性与当前执行时间点匹配的各工作流任务,确定为满足执行条件的工作流任务,并获取满足执行条件的各工作流任务对应的任务信息,以根据任务信息生成工作流任务数据。进一步地,通过创建消息队列,并根据与消息队列关联的第一处理指令,将各工作流任务数据按照存储规则依次存储至消息队列中,同时,根据与消息队列关联的第二处理指令,按照读取规则依次从消息队列中读取工作流任务数据,从而实现基于消息队列处理大量的工作流任务数据,避免工作流任务数据的处理延迟以及处理错漏,同时通过对各工作流的工作流任务数据进行统一分配和执行处理,实现对工作流的并发执行处理,避免大量待处理的工作流任务数据堆积,降低服务器负载强度,提升对工作流的处理效率。
在一个实施例中,如图13所示,执行目标子任务的方式,具体包括以下步骤:
步骤S1302,解析目标子任务对应的运行数据以获得与目标子任务对应的应用模板数据。
具体地,目标子任务的运行数据包括目标子任务的执行状态、应用模板数据、开始时间、结束时间以及报错信息,则在对任务参数信息和运行数据进行表达式解析处理和执行数据替换处理,获得待执行的目标子任务之后,通过解析目标子任务对应的运行数据以获得目标子任务对应的应用模板数据。
其中,应用模板数据具体可以理解为对应子实例中使用的具体模板,比如“时间触发器”的子实例,其应用模板数据为“timer-trigger”,即计时触发器,又比如“python脚本执行”的子实例,其应用模板数据为“python-script”即python脚本的应用模板数据。进一步地,根据应用模板数据,则可确定执行当前工作流中各目标子任务时需要调用的具体模板,而根据所调用的具体模板,还可确定出相应目标子任务实际需要完成的功能,比如具体是需要配置时间触发器来设置任务的执行时间点、还是需要调用并执行Python脚本以获得相应的脚本执行结果。
步骤S1304,根据应用模板数据确定与目标子任务对应的功能函数。
具体地,应用模板数据用于决定该目标子任务的具体运行逻辑,即可根据应用模板数据确定出具体是需要调用哪个功能函数作为当前目标子任务的运行逻辑,则可通过对应用模板数据进行进一步解析以获得与目标子任务对应的功能函数。
其中,对应用模板数据进行解析时,具体是通过确定对应用模板数据携带的功能函数进行解析和识别,以确定该应用模板数据携带的功能函数,具体可以是一个功能函数或多个功能函数,也可以是多个功能函数联合得到的复合功能函数。
举例来说,比如“时间触发器”的子实例,其应用模板数据为“timer-trigger”,则该应用模板数据携带的功能函数,具体包括获取当前时间点的功能函数、统计是否达到预设工作周期的功能函数、以及判断当前时间点是否和时间配置信息中的执行时间点匹配的功能函数等,通过执行多个功能函数以配置时间触发器来设置任务的执行时间点,并在当前时间点和时间配置信息中的执行时间点匹配时跳转执行下一目标子任务,比如跳转执行“Python脚本执行”的目标子任务。
步骤S1306,解析目标子任务对应的参数信息以获得各参数字段、以及参数字段对应的参数内容。
具体地,目标子任务对应的参数信息可以理解为各子实例的参数配置信息,包括不同的参数字段,比如参数key字段、参数valve字段、参数类型字段以及参数描述字段等,则通过对参数信息进行解析,可获得各参数字段以及各参数字段对应的参数内容,即具体是获得通过目标子任务调用应用模板并执行功能函数时实际所需的参数名称、参数类型以及参数值,同时还可获取执行功能函数时实际应用过程中需要满足的与参数相关的约束条件(其中,具体是根据参数描述信息进一步确定出与参数关联的约束条件)等。
在一个实施例中,目标子任务对应的参数信息以及运行数据等,具体可以采用以下表6所示的与目标子任务对应的Json格式的流程数据结构表,进行表示:
表6与目标子任务对应的Json格式的流程数据结构表
其中,参照表6可知,该目标子任务对应的Json格式的流程数据结构表中,具体包括该目标子任务对应的应用名称(即“APP实例描述”),还包括目标子任务对应的参数信息,参数信息具体采用<参数key,参数value,参数类型,参数描述>的方式进行表示。其中,参数key表示参数名称,参数value表示参数的具体参数内容,参数value可以是常量(比如数字或者字符串),也可以是使用路径语法表达式引用前面任意一个子实例的输出结果。参数类型指的是参数的数据类型,具体可以是string(字符串)、boolean(布尔类型)、以及number(数字)的类型,参数描述表示与配置参数对应的其他注释信息,比如对参数的类型和约束进行进一步描述和解释。
同样地,参照表6可知,该目标子任务对应的Json格式的流程数据结构表中,还包括目标子任务对应的运行数据,具体包括:应用模板数据、运行输出(即APP实例的输出结果)、报错信息(即APP实例执行中出错时的错误提示信息)、执行状态(即APP实例的状态,也可以理解为是目标子任务的执行状态,包括比如待执行、执行中、以及已执行等状态)、开始时间(即APP实例执行的开始时间)、以及结束时间(即APP实例执行的结束时间)。其中,目标子任务对应的应用模板(即“APP实例采用的APP模板”),用于确定出执行该目标子任务时所需要调用和执行的功能的函数。
其中,参照表6可知,该目标子任务对应的Json格式的流程数据结构表中,还包括当前目标子任务在基于工作流管理平台构建的工作流中的位置,即当前目标子任务在所显示的工作流管理平台上的坐标,具体可以理解为“APP实例在前端画布的坐标位置”。其中,由于具体是基于工作流管理平台采用拖拽连线的方式构建与工作流任务处理请求对应的待处理工作流,则目标子任务在工作流管理平台上的坐标可根据构建过程中的拖拽操作进行调整和修改,即当前目标子任务在工作流中的位置起到的是显示作用,以供使用对象查看。
进一步地,参照表6可知,该目标子任务对应的Json格式的流程数据结构表中,还包括目标子任务对应的实例编号(即实例ID),用于表示“在工作流中表示APP实例的唯一ID”,即用于标识当前目标子任务对应的子实例的唯一编号,目标子任务对应的子实例具体可以是“python脚本执行”的子实例,该子实例的实例ID为“sys-52-076123”,目标子任务对应的子实例还可以是“时间触发器”的子实例,该姿势的实例ID为“sys-6275-026193”。
其中,在执行当前目标子任务的过程中,若待处理工作流存在多个目标子任务、且各目标子任务之间存在先后跳转关系,则为了保证工作流的正常执行和处理,还需获得当前目标子任务对应的上一跳实例、以及下一跳实例,则具体可以采用“"上一跳实例Id":[<指向的上一个APP实例Id>]”、以及“"下一跳实例Id":[<指向的下一个APP实例Id>]”的方式,获得当前目标子任务对应的上一跳实例的实例编号、以及下一跳实例的实例编号。
步骤S1308,将参数字段对应的参数内容传入功能函数中,并执行功能函数,获得子任务执行结果。
具体地,参数字段是功能函数运行时所需的具体参数,则在目标子任务运行过程中,需要解析目标子任务对应的参数信息,以获得参数信息中包括的各参数字段、以及各参数字段对应的参数内容(即参数value,具体可以是数值或字符串等)。
进一步地,通过将参数字段中的参数内容传入应用模板数据对应的功能函数,并执行已传入参数内容的功能函数以将获得功能函数的执行结果并输出,即输出得到该目标子任务对应的子任务执行结果。
其中,执行完当前的目标子任务后,根据执行时间和调用关系(即前后跳转关系)确定出当前目标子任务的下一跳目标子任务,并执行下一跳目标子任务,依次类推,直至将各目标子任务均执行完,确定当前工作流处理完成。
在一个实施例中,如图14所示,提供了一种基于任务消息队列读取子实例任务的示意图,参照图14可知,在获取与流程关系字段对应的子实例信息之后,进一步对子实例信息中各子实例任务的数据状态进行初始化,具体是初始化成为“未处理”或“待处理”的状态,即表明当前子实例信息对应的子实例任务为待处理。
具体来说,通过建立用于存储子实例任务的任务消息队列(即APP任务消息队列),将所获得的子实例任务(包括APP_1、APP_1、APP_1、……、以及APP_N等)依次存储至任务消息队列中。同时,通过获取工作流中的起始节点(即起始子实例)即时间触发器的子实例,并通过执行时间触发器的子实例,按照子实例任务的前后跳转关系,比如按照起始子实例APP_1、下一跳子实例APP_2、第三跳子实例APP_3、……等各子实例之间的前后跳转关系,依次将所获得的子实例任务依次存储至任务消息队列中,从而利用子任务消息队列实现先进先出的目的,保障各目标子任务的准确执行,避免出现同时目标子任务遗漏执行的情况出现。
进一步地,通过调用与任务消息队列关联的第二任务守护进程,按照执行时间依次从任务消息队列中读取子实例任务,并更新子实例任务对应的数据状态。其中,采用基于子任务消息队列依次读取并执行各目标子任务的方式,可保障各目标子任务按照工作流的流程关系准确执行,直至各目标子任务执行结束以获得工作流任务处理结果。
其中,与任务消息队列关联的第二任务守护进程,具体运行于工作流执行引擎中的不同容器(包括容器1、容器2、……、容器N等,该些容器具体可以是docker容器,docker容器属于轻量级的虚拟化容器,可通过构建自定义的Docker镜像来打包应用程序和它的所有依赖项,然后将镜像直接部署到生产环境上)中,通过运行第二任务守护进程,实时检测任务消息队列中是否存在可执行的子实例任务,若检测到任务消息队列中存在子实例任务,则依次从任务消息队列中读取子实例任务,并更新子实例任务对应的数据状态(具体是将子实例任务的数据状态设置为处理中),从而可将当前处理中的子实例任务、以及未处理(或待处理)的子实例任务进行区分,避免出现重复执行、或漏执行子实例任务的情况。
本实施例中,通过解析目标子任务对应的运行数据,获得与目标子任务对应的应用模板数据,并根据应用模板数据确定与目标子任务对应的功能函数。进一步地,通过解析目标子任务对应的参数信息,获得各参数字段、以及参数字段对应的参数内容,并将参数字段对应的参数内容,入功能函数中,通过执行功能函数以获得子任务执行结果,实现了对目标子任务的数据解析,获得执行目标子任务过程中所需调用的功能函数、以及调用并执行该些功能函数实际所需的参数内容,以将实际所需的参数内容传入功能函数后,准确、快速执行功能函数,避免出现参数内容遗漏,减少执行失误的情况,进一步提升目标子任务的执行效率。
在一个实施例中,在从各子实例字段信息,确定出与各子实例任务对应的任务参数信息和运行数据之前,方法还包括:
将各子实例字段信息加载至内存中以构建得到与子实例编号关联的映射全局变量结构数据。其中,映射全局变量结构数据用于确定出与子实例编号对应的任务参数信息和运行数据。
具体地,由于各目标子任务对应的运行数据通常存储在数据库中,则在获取与各子实例任务对应的任务参数信息和运行数据之前,需要将各子实例字段信息加载至内存中。其中,各子实例字段信息,具体可以包括子实例编号、参数字段信息(即参数key字段、参数valve字段、参数类型字段以及参数描述字段等)、运行数据(包括运行输出、开始时间、结束时间、执行状态、以及报错信息等)。
进一步地,通过将各子实例字段信息加载至服务器的内存中,并根据子实例编号、以及各子实例字段信息(包括子实例编号、参数字段信息以及运行数据等)构建得到与子实例编号关联的映射全局变量结构数据。其中,每个子实例编号和其对应的子实例字段信息之间存在映射关系,则基于与子实例编号关联的映射全局变量结构数据,可获得与每一子实例编号对应的各子实例字段信息,从而可进一步从各子实例字段信息中确定出任务参数信息和运行数据。
在一个实施例中,如图15所示,提供了一种与子实例编号关联的映射全局变量结构数据的示意图,参照图15可知,工作流包括多个目标子任务,各目标子任务分别对应各自的子实例任务(即APP实例任务)、且每个子实例任务分别设置有各自对应的子实例编号,比如包括APP实例编号1、APP实例编号2、APP实例编号3以及APP实例编号N等。
其中,参照图15可知,每个APP实例编号和其对应的子实例字段信息之间存在映射关系,比如APP实例编号1和其对应的子实例字段信息(即APP实例的输入输出数据)之间存在映射关系,以此类推,APP实例编号N和其对应的子实例字段信息(即APP实例的输入输出数据)之间也存在映射关系。
可以理解的是,通过将APP实例编号作为索引、以及将子实例字段信息(即APP实例的输入输出数据)作为内容,则可根据APP实例编号和子实例字段信息之间的映射关系,建立与子实例编号关联的映射全局变量结构数据。进一步地,在获知APP实例编号(即子实例编号)时,可基于与子实例编号关联的映射全局变量结构数据,获得与该APP实例编号对应的各子实例字段信息,从而可进一步从各子实例字段信息中确定出任务参数信息和运行数据。
进一步地,参照图15可知,从各子实例字段信息中所确定出任务参数信息和运行数据,具体包括参数字段信息(即参数key字段、参数valve字段、参数类型字段以及参数描述字段等)、运行数据(包括运行输出、开始时间、结束时间、执行状态、以及报错信息等)。
在一个实施例中,基于各子实例字段信息中进行信息筛选,确定出与子实例任务对应的任务参数信息和运行数据的步骤,包括:
若读取到待执行的子实例任务,获取子实例任务对应的目标子实例编号;遍历映射全局变量结构数据,获得与目标子实例编号匹配的任务参数信息和运行数据。
具体地,若读取到待执行的子实例任务,则获取子实例任务对应的目标子实例编号,并以目标子实例编号为索引,遍历映射全局变量结构数据,若匹配成功,即确定映射全局变量结构数据中存在目标子实例编号时,从映射全局变量结构数据中获取与目标子实例编号之间存在映射关系的子实例字段信息,具体包括子实例编号、参数字段信息(即参数key字段、参数valve字段、参数类型字段以及参数描述字段等)、运行数据(包括运行输出、开始时间、结束时间、执行状态、以及报错信息等)等,并从子实例字段信息中提取任务参数信息(包括参数名称、参数内容、参数类型等)和运行数据(包括输出结果、开始时间、结束时间、执行状态以及报错信息等)。
本实施例中,通过将各子实例字段信息加载至内存中,以构建得到与子实例编号关联的映射全局变量结构数据,并在读取到待执行的子实例任务,可直接获取子实例任务对应的目标子实例编号,并遍历映射全局变量结构数据,来获取与目标子实例编号对应的任务参数信息和运行数据,即可通过目标子实例编号进行定位,快速、准确获得与目标子实例编号匹配的任务参数信息和运行数据,进一步提升基于任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务时的处理效率,减少解析处理和数据替换处理过程中由于任务参数信息和运行数据不准确而导致的误差数据。
在一个实施例中,如图16所示,提供了一种工作流任务处理方法,具体包括以下步骤:
步骤S1601,若检测到工作流任务处理请求,获取与工作流任务处理请求对应的待处理工作流,并获取待处理工作流携带的时间配置信息。
具体地,若检测到基于工作流管理平台触发的工作流任务处理请求,则获取与工作流处理请求对应的待处理工作流。其中,基于工作流管理平台触发工作流任务处理请求时,具体是基于工作流管理平台采用拖拽连线的方式构建与工作流任务处理请求对应的待处理工作流,并在构建待处理工作流后进一步获取待处理工作流携带的时间配置信息。
步骤S1602,根据时间配置信息确定与待处理工作流对应的执行时间周期,并根据执行时间周期确定待处理工作流在预设工作周期内的执行次数。
具体地,服务器后台的任务调度中心接收并存储有大量待处理工作流、以及与各待处理工作流关联存储的应用参数,即每个待处理工作流分别对应各自的“时间触发器”子实例、以及针对“时间触发器”子实例进行参数配置得到的时间配置信息,进而具体是根据每个待处理工作流对应的时间配置信息确定待处理工作流对中各子实例的执行时间周期。
进一步地,在确定出待处理工作流对中各子实例的执行时间周期后,进一步预测得到待处理工作流中各子实例在预设工作周期中执行次数、以及每次执行的具体执行时间点。
举例来说,针对“每周一上午08:00:00执行python脚本文件”的工作流,若该工作流创建时间为“20XX-04-21-16:30:00”,针对“每周一上午08:00:00”的时间触发器子实例,其执行时间周期即“每周一”,并在预设工作周期内比如“未来7周内”确定该工作流的执行次数为7次。
步骤S1603,基于执行时间周期和执行次数确定待处理工作流每次执行的时间点,并将待处理工作流每次执行的时间点以及执行时间周期确定为待处理工作流的时间属性,得到携带时间属性的各工作流任务。
具体地,在确定出待处理工作流对中各子实例的执行时间周期后,进一步根据执行时间周期预测得到待处理工作流中各子实例在预设工作周期中执行次数,并基于执行时间周期和执行次数确定待处理工作流每次执行的时间点。进一步地,通过将待处理工作流每次执行的时间点以及执行时间周期确定为待处理工作流的时间属性,即可得到携带时间属性的各工作流任务。
举例来说,针对“每周一上午08:00:00执行python脚本文件”的工作流,若该工作流创建时间为“20XX-04-21-16:30:00”,针对“每周一上午08:00:00”的时间触发器子实例,其执行时间周期即“每周一”,以及预设工作周期比如“未来7周内”,确定该工作流的执行次数为7次,进而可基于执行时间周期和执行次数确定待处理工作流每次执行的时间点每次执行的具体执行时间点,即根据创建时间、执行时间周期以及执行次数确定出该工作流未来7次的执行时间点,即达到将待处理工作流转换成基于执行时间点的任务。
在一个实施例中,在获得携带时间属性的各工作流任务的过程中,根据任务类型的不同,对工作流的转换处理流程不同。其中,任务类型具体包括:单次任务、每分钟执行任务、每小时执行任务、每日执行任务、每周执行任务、以及每月执行任务等,则对各待处理工作流在预设执行工作周期内(比如未来一年内)的执行时间点进行预测时,需要将所有的单次任务、每分钟执行任务、每小时执行任务、每日执行任务、每周执行任务、以及每月执行任务等在未来一年内的执行时间点进行预测后,将相应待处理工作流转换成携带执行时间点的任务并存储在任务数据库中。
具体地,若选定的任务类型为“单次任务”,则需要针对单次任务设置其执行时间点,比如设置其执行时间点为“20XX-04-21-18:00:00”,且该单次任务在达到所设置的执行时间点进行执行,在执行后即执行完毕,不进行重复执行。
若选定的任务类型为“每分钟执行任务”,其执行周期为每分钟,则需要进一步设置秒数,即精确设置到是每分钟的哪一秒触发执行该待处理工作流中的任务,比如设置执行时间点为“每分钟第03秒”,若预设工作周期为10分钟,则在10分钟中每分钟第03秒均需要执行该工作流中的任务,即在未来10分钟内需要执行10次该工作流中的任务。
若选定的任务类型为“每小时执行任务”,其执行周期为每小时,则需要进一步设置具体的分秒数,即精确设置到是每小时的哪一分钟的哪一秒触发执行该待处理工作流中的任务,比如设置执行时间点为“每小时的第10分10秒”,若预设工作周期为3小时,则在未来3小时中每小时的第10分10秒均需要执行该工作流中的任务,即在未来3小时内需要执行3次该工作流中的任务。
若选定的任务类型为“每日执行任务”,其执行周期为每天,则需要进一步设置具体的时分秒数,即精确设置到是每天的哪一小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每日02:00:00”,若预设工作周期为一周,则在未来一周中每天的第02时00分00秒均需要执行该工作流中的任务,即在未来一周内需要执行7次该工作流中的任务。
若选定的任务类型为“每周执行任务”,其执行周期为每周,则需要进一步设置具体的日时分秒数,即精确设置到是每周的哪一天的哪一小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每周三06:00:00”,若预设工作周期为一个月,则在未来一个月中每周三的第06时00分00秒均需要执行该工作流中的任务,即在未来一个月内需要执行4次该工作流中的任务。
若选定的任务类型为“每月执行任务”,其执行周期为每月,则需要进一步设置具体的日时分秒数,即精确设置到是每个月的哪一天的哪一小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每月第4日的04:00:00”,若预设工作周期为3个月,则在未来3个月中每月的第四日的第04时00分00秒均需要执行该工作流中的任务,即在未来3个月内需要执行3次该工作流中的任务。
步骤S1604,调用第一任务守护进程,基于存储有各工作流任务的任务数据库进行轮询处理。
具体地,第一任务守护进程表示用于监测时间和轮询处理的任务守护进程,其实现原理是通过将计时器和循环机制进行结合,即通过设置用于定时执行轮询任务的计时器,在触发计时器时对存储有各工作流任务的任务数据库进行轮询处理,判断是否存在时间属性满足执行条件的工作流任务。进一步地,在经过预设间隔时间(即用于定时触发计时器而设置的预设时间间隔)后再次开启计时器,继续对任务数据库进行轮询处理以判断是否存在时间属性满足执行条件的工作流任务。
进一步地,通过执行第一任务守护进程可不断地检查任务数据库中各工作流任务的任务数据,以判断当前时间是否有工作流任务需要执行。其中,若检测到时间属性满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据。而若未检测到满足执行条件的工作流任务,则在经过预设时间间隔后再次进行轮询处理以判断当前时间是否有工作流任务需要执行。
步骤S1605,基于在任务数据库进行工作流任务筛选,将时间属性与当前执行时间点匹配的各工作流任务确定为满足执行条件的工作流任务。
具体地,通过调用第一任务守护进程,基于存储有各工作流任务的任务数据库进行轮询处理和工作流任务筛选处理,以从任务数据库中确定出时间属性与当前执行时间点匹配的各工作流任务,并进一步将所确定出的各工作流任务确定为满足执行条件的工作流任务。
步骤S1606,获取满足执行条件的各工作流任务对应的任务信息,并根据任务信息生成工作流任务数据。
具体地,在确定出满足执行条件的各工作流任务后,进一步获取各工作流任务对应的任务信息,以根据任务信息来触发生产任务和消费任务,其中,生产任务用于根据任务信息生成工作流任务数据,而消费任务用于读取并消费工作流任务数据。
进一步地,生产任务和消费任务是通过消息队列的方式来实现,而消息队列具体可以是Redis消息队列(Redis消息队列指的是基于Redis数据存储的消息传递系统,用于可以实现生产者和消费者之间的异步通信,从而提高系统的并发性和可扩展性),且Redis消息队列支持多个消费者同时取出消息,当多个消费者同时从List的尾部取出消息时,每个消息只能被一个消费者处理,即如果一个消息被消费者A处理,则其他消费者无法再处理这个消息,进而可通过利用Redis消息队列支持多个消费者同时取出消息的特性,让工作流的执行实现集群化处理、以及并发处理,提升工作流的执行处理效率。
步骤S1607,创建消息队列,并根据与消息队列关联的第一处理指令,将各工作流任务数据按照存储规则依次存储至消息队列中。
其中,消息具体可以是Redis消息队列,而Redis消息队列具体可以通过利用List数据结构(即支持在列表的两端插入和删除元素双向链表结构)来实现。
具体地,通过创建Redis消息队列,并利用Redis消息队列存储各工作流任务数据。其中,与消息队列关联的第一处理指令具体可以包括LPUSH命令(即用于将一个或多个值插入到列表key的头部的命令),即通过LPUSH命令将工作流任务数据插入到队列的左端(即头部)。
举例来说,“LPUSH orders_queue order1”命令,用于将工作流任务数据order1插入至队列orders_queue的左端。
步骤S1608,根据与消息队列关联的第二处理指令,按照读取规则依次从消息队列中读取工作流任务数据。
其中,与消息队列关联的第二处理指令具体可以包括BRPOP命令(即列表的阻塞式弹出命令,会导致阻塞,直到队列中有数据可读取,而一旦有数据可读取,会返回从队列中读取到的工作流任务数据)。
具体地,通过执行BRPOP命令,按照读取规则(即先进先出的规则)从队列的右端读取工作流任务数据。其中,执行BRPOP命令时会导致阻塞,即若消息队列中不存在可读取的工作流任务数据时不会执行后续操作,直到队列中有数据可读取,而一旦有数据可读取,BRPOP命令会返回从队列中读取到的工作流任务数据。
举例来说,“BRPOP orders_queue()”命令,用于从消息队列orders_queue的右端读取工作流任务数据,且在消息队列orders_queue中不存在可读取的工作流任务数据时,出现堵塞,直至消息队列orders_queue中有数据可读取,并在有数据可读取时返回从队列中读取到的工作流任务数据。
在一个实施例中,在从消息队列中读取工作流任务数据后,还需调用工作流执行引擎创建与工作流任务数据对应的工作流实例,并在执行工作流实例对应的各目标子任务后,根据子任务执行结果生成确认信息,并将确认信息依次存储至所构建的确认信息队列中。
其中,具体可以采用RPUSH命令(即用于向存储在key中的列表的尾部插入所有指定的值的命令)将确认信息插入到队列的右端。
举例来说,“RPUSH orders_queue_processed order2”命令,用于将确认信息order2插入确认信息队列orders_queue_processed的右端。
在一个实施例中,针对消息队列的状态,即对队列中待处理的工作流任务数据的数量的状态监测,通过LLEN命令(即用于获取队列中未处理的工作流任务数据数量、返回队列长度命令)实现。
举例来说,“LLEN orders_queue”命令,用于返回消息队列orders_queue的队列长度、以获得消息队列中未处理的工作流任务数据数量。
步骤S1609,调用工作流执行引擎创建与工作流任务数据对应的工作流实例。
具体地,通过调用工作流执行引擎,在工作流运行数据库中创建记录有工作流任务的任务编号、工作流编号、任务名称、执行对象、执行状态(比如未执行、执行中、以及执行结束等状态)、开始时间、结束时间、以及各子实例执行之间的流程关系的执行记录数据表。
进一步地,根据执行记录数据表、以及执行记录数据表中各字段的实际字段内容,比如任务编号的字段内容为“100001”、工作流编号的字段内容为“20002”、执行状态的字段内容为“未执行”、以及流程关系的字段内容为“第一跳子任务实例1-时间触发器、下一跳子任务实例2-执行XX脚本”等,得到与工作流任务数据对应的工作流实例。
步骤S1610,获取工作流实例对应的工作流实例信息,并基于工作流实例信息进行字段识别处理,以获得与工作流实例信息关联的各关键字段,从各关键字段中筛选出流程关系字段,获取与流程关系字段对应的子实例字段信息。
其中,与工作流实例对应的工作流实例信息具体包括工作流实例对应的工作流名称、工作流实例所属的工作流编号、工作流包括的各子实例的实例名称、执行状态(比如未执行、执行中、以及执行结束等状态)、开始时间、结束时间、以及各子实例执行之间的流程关系等数据。
具体地,通过获取与工作流实例对应的工作流实例信息,包括工作流实例对应的工作流名称、工作流实例所属的工作流编号、工作流包括的各子实例的实例名称、子实例的参数配置信息、执行状态(比如未执行、执行中、以及执行结束等状态)、开始时间、结束时间、以及各子实例执行之间的流程关系等数据,并基于工作流实例信息进行信息筛选,识别并筛选出工作流实例包括的各子实例、各子实例的参数配置信息以及各子实例的前后跳转关系(比如当前某子实例的前一跳子实例、以及后一跳子实例),即得到与工作流实例关联的各子实例字段信息。
步骤S1611,初始化子实例信息中各子实例任务的数据状态,并将初始化后的子实例任务依次存储至任务消息队列中。
具体地,在获取与流程关系字段对应的子实例信息之后,进一步对子实例信息中各子实例任务的数据状态进行初始化,具体是初始化成为“未处理”或“待处理”的状态,即表明当前子实例信息对应的子实例任务为待处理。
其中,通过建立用于存储子实例任务的任务消息队列,将所获得的子实例任务依次存储至任务消息队列中。同时,通过获取工作流中的起始节点(即起始子实例)即时间触发器的子实例,并通过执行时间触发器的子实例,按照子实例任务的前后跳转关系,比如按照起始子实例、下一跳子实例、第三跳子实例……等子实例之间的前后跳转关系,依次将所获得的子实例任务依次存储至任务消息队列中。
步骤S1612,调用与任务消息队列关联的第二任务守护进程,按照执行时间依次从任务消息队列中读取子实例任务,并更新子实例任务对应的数据状态。
其中,与任务消息队列关联的第二任务守护进程具体运行于工作流执行引擎中的不同容器(具体可以是docker容器,属于轻量级的虚拟化容器,可通过构建自定义的Docker镜像来打包应用程序和它的所有依赖项,然后将镜像直接部署到生产环境上)中。
具体地,通过运行第二任务守护进程实时检测任务消息队列中是否存在可执行的子实例任务,若检测到任务消息队列中存在子实例任务,则依次从任务消息队列中读取子实例任务,并更新子实例任务对应的数据状态(具体是将子实例任务的数据状态设置为处理中),从而可将当前处理中的子实例任务和未处理(或待处理)的子实例任务进行区分,避免出现重复执行、或漏执行子实例任务的情况。
步骤S1613,获取更新后的子实例任务对应的子实例字段信息,将各子实例字段信息加载至内存中,并构建得到与子实例编号关联的映射全局变量结构数据,映射全局变量结构数据用于确定出与子实例编号对应的任务参数信息和运行数据。
具体地,由于各目标子任务对应的运行数据通常存储在数据库中,则在获取与各子实例任务对应的任务参数信息和运行数据之前,需要将更新后的子实例任务对应的子实例字段信息加载至内存中。
其中,各子实例字段信息具体可以包括子实例编号、参数字段信息(即参数key字段、参数valve字段、参数类型字段以及参数描述字段等)、运行数据(包括运行输出、开始时间、结束时间、执行状态、以及报错信息等)。
进一步地,通过将各子实例字段信息加载至服务器的内存中,并根据子实例编号、以及各子实例字段信息(包括子实例编号、参数字段信息以及运行数据等)构建得到与子实例编号关联的映射全局变量结构数据。其中,每个子实例编号和其对应的子实例字段信息之间存在映射关系,则根据子实例对与子实例编号关联的映射全局变量结构数据进行查询和搜索,即可获得与子实例编号对应的各子实例字段信息,从而可进一步从各子实例字段信息中确定出任务参数信息和运行数据。
步骤S1614,若读取到待执行的子实例任务,获取子实例任务对应的目标子实例编号。
具体地,若读取到待执行的子实例任务,则获取子实例任务对应的目标子实例编号,并以目标子实例编号为索引,根据目标子实例编号遍历映射全局变量结构数据判断确定映射全局变量结构数据中是否存在目标子实例编号。
步骤S1615,遍历映射全局变量结构数据,获得与目标子实例编号匹配的任务参数信息和运行数据。
具体地,以目标子实例编号为索引,根据目标子实例编号遍历映射全局变量结构数据时,若匹配成功即确定映射全局变量结构数据中存在目标子实例编号时,从映射全局变量结构数据中获取与目标子实例编号之间存在映射关系的子实例字段信息。
其中,子实例字段信息包括子实例编号、参数字段信息(即参数key字段、参数valve字段、参数类型字段以及参数描述字段等)、以及运行数据(包括运行输出、开始时间、结束时间、执行状态、以及报错信息等),则具体是从子实例字段信息中提取任务参数信息(包括参数名称、参数内容、参数类型等)和运行数据(包括输出结果、开始时间、结束时间、执行状态以及报错信息等)。
步骤S1616,对任务参数信息进行表达式解析处理以解析得到对应的路径语法表达式,并根据运行数据对路径语法表达式进行数据替换处理以替换得到携带运行数据的待执行的目标子任务。
其中,任务参数信息即子实例的参数配置信息,具体采用<参数key,参数value,参数类型,参数描述>的方式进行表示。其中,参数key表示参数名称,参数value表示参数的具体参数内容,参数value可以是常量(比如数字或者字符串),也可以是使用路径语法表达式引用前面任意一个子实例的输出结果。参数类型指的是参数的数据类型,具体可以是string(字符串)、boolean(布尔类型)、以及number(数字)的类型,参数描述表示与配置参数对应的其他注释信息,比如对参数的类型和约束进行进一步描述和解释。
进一步地,参数value是使用路径语法表达式引用前面任意一个子实例的输出结果时,则需要对任务参数信息进行表达式解析处理以解析得到对应的路径语法表达式,进而通过利用运行数据对路径语法表达式进行数据替换处理,以在进行数据替换处理后使得相应子实例中包括实际执行时所需的具体运行数据,即得到的是携带运行数据的待执行的目标子任务。
其中,在需要获取当前参数的参数value时,若涉及多个层级或者多个存储路径套用的情况,比如存在当前子实例的参数的参数valve是上一跳子实例的输出结果,而上一跳子实例的参数是前面某一跳子实例的输出结果时,即存在多个层级或多个存储路径套用的情况,类似于需要获取某个文件夹中的文本文件,而该文件夹之上还嵌套有多个其他文件夹时,则需要获得所嵌套的每个文件夹的文件夹名称得到该文本文件的访问路径,进而基于访问路径进行层层递进访问以获得所需的文本文件的情况。
举例来说,若子实例“ID2”的“parameter”即入参数组中的参数key值(即参数value)是子实例“ID1”的“data”即输出结果,则通过对路径语法表达式进行解析,并获取子实例“ID1”的输出结果“XXX”,通过将子实例“ID2”的参数key值(即参数value)替换为输出结果“XXX”,则在进行数据替换处理后获得执行子实例“ID2”时的实际参数key值,即获得可直接执行的、携带运行数据的目标子任务。
步骤S1617,按照目标子任务的执行时间和调用关系将各目标子任务依次推送至子任务消息队列中。
具体地,目标子任务为携带执行实际所需的运行数据的子任务,则可按照目标子任务的执行时间和调用关系依次将各目标子任务依次推送至子任务消息队列中,以便后续基于子任务消息队列依次读取并执行各目标子任务,直至各目标子任务执行结束以获得工作流任务处理结果。
其中,通过设置子任务消息队列,可将各目标子任务按照执行时间和调用关系(即前后跳转关系)依次推送至子任务消息队列中,从而利用子任务消息队列实现先进先出的目的,保障各目标子任务的准确执行,避免出现目标子任务遗漏执行的情况出现。
步骤S1618,基于子任务消息队列依次读取各目标子任务,并解析各目标子任务对应的运行数据以获得与各目标子任务对应的应用模板数据。
具体地,通过采用基于子任务消息队列依次读取并执行各目标子任务的方式,可保障各目标子任务按照工作流的流程关系准确执行,直至各目标子任务执行结束,以获得工作流任务处理结果。
其中,目标子任务的运行数据包括目标子任务的执行状态、应用模板数据、开始时间、结束时间以及报错信息,则在对任务参数信息和运行数据进行表达式解析处理和执行数据替换处理,获得待执行的目标子任务之后,通过解析目标子任务对应的运行数据以获得目标子任务对应的应用模板数据。
进一步地,应用模板数据具体可以理解为对应子实例中使用的具体模板,比如“时间触发器”的子实例,其应用模板数据为“timer-trigger”即计时触发器,又比如“python脚本执行”的子实例,其应用模板数据为“python-script”即python脚本的应用模板数据。
其中,根据应用模板数据可确定执行当前工作流中各目标子任务时,需要调用的具体模板,而根据所调用的具体模板还可确定出相应目标子任务实际需要完成的功能,比如具体是需要配置时间触发器来设置任务的执行时间点、还是需要调用并执行Python脚本以获得相应的脚本执行结果。
步骤S1619,根据各应用模板数据确定与各目标子任务对应的功能函数。
具体地,应用模板数据用于决定该目标子任务的具体运行逻辑,即可根据应用模板数据确定出具体是需要调用哪个功能函数作为当前目标子任务的运行逻辑,则可通过对应用模板数据进行进一步解析以获得与目标子任务对应的功能函数。
其中,对应用模板数据进行解析时,具体是通过确定对应用模板数据携带的功能函数进行解析和识别,确定该应用模板数据携带的功能函数,具体可以是一个功能函数或多个功能函数,也可以是多个功能函数联合得到的复合功能函数。
举例来说,比如“时间触发器”的子实例,其应用模板数据为“timer-trigger”,则该应用模板数据携带的功能函数具体包括获取当前时间点的功能函数、统计是否达到预设工作周期的功能函数、以及判断当前时间点是否和时间配置信息中的执行时间点匹配的功能函数等,通过执行多个功能函数以配置时间触发器来设置任务的执行时间点,并在当前时间点和时间配置信息中的执行时间点匹配时跳转执行下一目标子任务,比如跳转执行“Python脚本执行”的目标子任务。
步骤S1620,解析各目标子任务对应的参数信息以获得各参数字段、以及参数字段对应的参数内容,将参数字段对应的参数内容传入功能函数中,并执行功能函数,获得对应的子任务执行结果。
具体地,目标子任务对应的参数信息具体可以理解为各子实例的参数配置信息,包括不同的参数字段,比如参数key字段、参数valve字段、参数类型字段以及参数描述字段等,则通过对参数信息进行解析,可获得各参数字段以及各参数字段对应的参数内容,即具体是获得执行目标子任务时调用的应用模板、以及与应用模板对应的功能函数、以及执行目标子任务时实际所需的参数名称、参数类型以及参数值,同时还可获取执行功能函数时实际应用过程中需要满足的与参数相关的约束条件(其中,具体是根据参数描述信息进一步确定出与参数关联的约束条件)等。
其中,参数字段是功能函数运行时所需的具体参数,则在目标子任务运行过程中,需要解析目标子任务对应的参数信息,以获得参数信息中包括的各参数字段、以及各参数字段对应的参数内容(即参数value,具体可以是数值或字符串等)。
进一步地,通过将参数字段中的参数内容传入应用模板数据对应的功能函数,并执行已传入参数内容的功能函数以将获得功能函数的执行结果并输出,即输出得到该目标子任务对应的子任务执行结果。
其中,执行完当前的目标子任务后,根据执行时间和调用关系(即前后跳转关系)确定出当前目标子任务的下一跳目标子任务,并执行下一跳目标子任务,依次类推,直至将各目标子任务均执行完,确定当前工作流处理完成。
步骤S1621,根据各子任务执行结果生成确认信息,并将确认信息依次存储至确认信息队列中。
具体地,根据子任务执行结果生成确认信息时,具体是生成目标子任务执行结束的信息,执行结束的信息用于表明该目标子任务执行完毕,可根据各目标子任务是否执行完毕的信息,避免出现重复执行造成服务资源浪费的问题。
进一步地,通过建立确认信息队列,将各确认信息按照确认信息的生成时间依次存储至确认信息队列中,并基于确认信息队列依次读取与各目标子任务对应的确认信息,从而达到保障确认信息是先进先出的状态,避免出现确认信息混乱导致的无法准确根据确认信息对工作流实例信息中的任务状态数据进行更新的问题。
在一个实施例中,在从消息队列中读取工作流任务数据后,还需调用工作流执行引擎创建与工作流任务数据对应的工作流实例,并在执行工作流实例对应的各目标子任务后,根据子任务执行结果生成确认信息,并将确认信息依次存储至所构建的确认信息队列中。
其中,具体可以采用RPUSH命令(即用于向存储在key中的列表的尾部插入所有指定的值的命令)将确认信息插入到队列的右端。
举例来说,“RPUSH orders_queue_processed order2”命令,用于将确认信息order2插入确认信息队列orders_queue_processed的右端。
步骤S1622,基于确认信息队列依次读取与各目标子任务对应的确认信息,并根据确认信息对工作流实例信息中的任务状态数据进行更新。
具体地,基于确认信息队列按照先进先出的读取规则依次读取与各目标子任务对应的确认信息,根据确认信息对工作流实例信息中的任务状态数据进行更新。
其中,具体是根据确认信息将工作流实例信息中的任务状态数据从“执行中”修改为“已执行”,从而可避免重复执行或遗漏执行的问题出现。
步骤S1623,若确定工作流实例信息中的任务状态数据均更新,确定各目标子任务执行结束,获得工作流任务处理结果。
具体地,通过利用确认信息对工作流实例信息中的任务状态数据进行更新,并在确定工作流实例信息中的任务状态数据均更新时,即完成了对各目标子任务的执行时,确定各目标子任务执行结束,完成对当前工作流的处理,获得相应的工作流处理结果。
上述工作流任务处理方法中,通过获取待处理工作流的时间配置信息,并根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务,从而实现对待处理工作流下的各工作流任务进行统一转换、分配和执行。进一步地,若检测到满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据,并创建与工作流任务数据对应的工作流实例,进而可通过获取与工作流实例对应的工作流实例信息,通过对工作流实例信息进行信息筛选以筛选出与工作流实例关联的各子实例字段信息,从而可将工作流实例划分为多个子实例任务进行执行,提升任务处理效率。其中,通过对各子实例字段信息进行信息筛选以确定出与各子实例任务对应的任务参数信息和运行数据,从而可根据任务参数信息和运行数据进行表达式解析处理和执行数据替换处理,以获得待执行的目标子任务。进而通过按照各目标子任务的执行时间和调用关系分别执行各目标子任务,直至各目标子任务执行结束,以获得工作流任务处理结果,实现了对各目标子任务的并发执行,而无需局限于传统串行执行方式,提升了任务执行效率,从而可准确、快速获得任务执行结果,减少资源消耗并提升资源利用效率。
在一个实施例中,如图17所示,提供了一种工作流任务处理方法,具体包括以下部分:
P1、配置任务(基于工作流管理平台采用拖拽连线的方式构建与工作流任务处理请求对应的待处理工作流,并设置工作流的运行时间):
通过获取待处理工作流的时间配置信息,并根据时间配置信息确定与待处理工作流对应的执行时间周期。
其中,工作流包括按照一定的顺序和规则执行的多个任务(或处理步骤),可用于实现一个或多个业务过程或业务项目,而待处理工作流的时间配置信息则用于确定出待处理工作流中各工作流任务的执行时间点、以及执行时间周期等数据。
在一个实施例中,基于工作流管理平台采用拖拽连线的方式,构建包括“时间触发器”的子实例、以及和“时间触发器”的子实例通过连线方式连接的“执行Python脚本”的子实例,得到的是用于实现“每周一上午08:00:00执行一个Python脚本”的工作流。
其中,通过连线方式可确定工作流中不同子实例之间的前后跳转关系,比如具体是需要先执行“时间触发器”的子实例,即在设置“每周一上午08:00:00”的时间配置信息后,再跳转执行“执行Python脚本”的子实例,以实现“每周一上午08:00:00执行一个Python脚本”的工作流的目的。
举例来说,某待处理工作流的时间配置信息包括“每周一的上午08:00:00执行任务1”,则可确定待处理工作流中“任务1”的执行时间点为“上午08:00:00”,执行时间周期为“每周一”,若需要确定出预设工作周期比如未来一个月内“任务1”的执行次数时,则可根据执行时间周期即“每周一”、以及预设工作周期即“一个月”,确定出一个月内“任务1”的执行次数为4次,执行时间点分别为未来一个月内每周一上午08:00:00。
同样地,由于待处理工作流通常包括对应不同的执行时间周期的多个工作流任务,具体可以是单次执行、每分钟执行、每小时执行、每日执行、每周执行以及每月执行的工作流任务,比如某待处理工作流的时间配置信息,还包括“每天上午10:00:00执行任务2”,则“任务2”的执行时间点为“上午10:00:00”,执行时间周期为“每天”,若需要确定出预设工作周期比如未来一周内“任务2”的执行次数时,则可根据执行时间周期即“每天”、以及预设工作周期即“一周”,确定出一周内“任务2”的执行次数为7次,执行时间点分别为未来一周内每天上午10:00:00。
P2、生成计划任务表(将所有工作流任务的时间配置转化为基于时间戳的任务,并存储在任务数据库中)
通过获取待处理工作流的时间配置信息,并根据时间配置信息确定与待处理工作流对应的执行时间周期,并在预设工作周期内,按照各执行时间周期将待处理工作流转换成携带时间属性的各工作流任务。
其中,服务器后台的任务调度中心接收并存储有大量待处理工作流、以及与各待处理工作流关联存储的应用参数,即每个待处理工作流,分别对应各自的“时间触发器”子实例、以及针对“时间触发器”子实例进行参数配置得到的时间配置信息,进而具体是根据每个待处理工作流对应的时间配置信息确定待处理工作流对中各子实例的执行时间周期。
进一步地,在确定出待处理工作流对中各子实例的执行时间周期后,进一步预测得到待处理工作流中各子实例在预设工作周期中执行次数、以及每次执行的具体执行时间点,从而将待处理工作流转换成基于时间戳(即时间属性)的任务(即子实例任务),并将转换得到的各任务存储在任务数据库中。
在一个实施例中,在获得携带时间属性的各工作流任务的过程中,根据任务类型的不同,对工作流的转换处理流程不同。其中,任务类型具体包括:单次任务、每分钟执行任务、每小时执行任务、每日执行任务、每周执行任务、以及每月执行任务等,则对各待处理工作流在预设执行工作周期内(比如未来一年内)的执行时间点进行预测时,需要对所有的单次任务、每分钟执行任务、每小时执行任务、每日执行任务、每周执行任务、以及每月执行任务等,在未来一年内的执行时间点进行预测,以将相应待处理工作流转换成携带执行时间点的任务,并将转换得到的各任务存储在任务数据库中。
其中,若选定的任务类型为“单次任务”,则需要针对单次任务设置其执行时间点,比如设置其执行时间点为“20XX-04-21-18:00:00”,且在达到所设置的执行时间点时执行该单次任务,在执行完该单次任务后即执行完毕,不对该单次任务进行重复执行。
若选定的任务类型为“每分钟执行任务”,其执行周期为每分钟,则需要进一步设置秒数,即精确设置到是每分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每分钟第03秒”,若预设工作周期为10分钟,则在10分钟中每分钟第03秒均需要执行该工作流中的任务,即在未来10分钟内需要执行10次该工作流中的任务。
若选定的任务类型为“每小时执行任务”,其执行周期为每小时,则需要进一步设置具体的分秒数,即精确设置到是每小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每小时的第10分10秒”,若预设工作周期为3小时,则在未来3小时中每小时的第10分10秒均需要执行该工作流中的任务,即在未来3小时内需要执行3次该工作流中的任务。
若选定的任务类型为“每日执行任务”,其执行周期为每天,则需要进一步设置具体的时分秒数,即精确设置到是每天的哪一小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每日02:00:00”,若预设工作周期为一周,则在未来一周中每天的第02时00分00秒均需要执行该工作流中的任务,即在未来一周内需要执行7次该工作流中的任务。
若选定的任务类型为“每周执行任务”,其执行周期为每周,则需要进一步设置具体的日时分秒数,即精确设置到是每周的哪一天的哪一小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每周三06:00:00”,若预设工作周期为一个月,则在未来一个月中每周三的第06时00分00秒均需要执行该工作流中的任务,即在未来一个月内需要执行4次该工作流中的任务。
若选定的任务类型为“每月执行任务”,其执行周期为每月,则需要进一步设置具体的日时分秒数,即精确设置到是每个月的哪一天的哪一小时的哪一分钟的哪一秒需要触发执行该待处理工作流中的任务,比如设置执行时间点为“每月第4日的04:00:00”,若预设工作周期为3个月,则在未来3个月中每月的第四日的第04时00分00秒均需要执行该工作流中的任务,即在未来3个月内需要执行3次该工作流中的任务。
P3、任务监测:
执行任务守护监测进程(即第一守护进程),通过轮询的方式判断当前是否有工作流任务需要执行,若有需要执行的工作流任务,则获取该工作流任务对应的任务信息。
具体地,调用第一任务守护进程,基于存储有各工作流任务的任务数据库进行轮询处理,若检测到时间属性满足执行条件的工作流任务,则获取满足执行条件的各工作流任务对应的任务信息,并根据任务信息生成工作流任务数据。
进一步地,在确定出满足执行条件的各工作流任务后,进一步获取各工作流任务对应的任务信息,以根据任务信息来触发生产任务和消费任务,其中,生产任务用于根据任务信息生成工作流任务数据,而消费任务用于读取并消费工作流任务数据。
其中,第一任务守护进程表示用于监测时间和轮询处理的任务守护进程,其实现原理是通过将计时器和循环机制进行结合,即通过设置用于定时执行轮询任务的计时器,在触发计时器时,对存储有各工作流任务的任务数据库进行轮询处理,判断是否存在时间属性满足执行条件的工作流任务。进一步地,在经过预设间隔时间(即用于定时触发计时器而设置的预设时间间隔)后再次开启计时器,继续对任务数据库进行轮询处理以判断是否存在时间属性满足执行条件的工作流任务。
也就是说,通过执行第一任务守护进程不断地检查任务数据库中各工作流任务的任务数据,以判断当前时间是否有工作流任务需要执行。其中,若检测到时间属性满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据。而若未检测到满足执行条件的工作流任务,则在经过预设时间间隔后再次进行轮询处理,判断当前时间是否有工作流任务需要执行。
P4、任务生产消费:
通过Redis消息队列的方式来实现任务的生产和消费。其中,在获取各工作流任务对应的任务信息后,根据任务信息来触发生产任务和消费任务,生产任务用于根据任务信息生成工作流任务数据,而消费任务用于读取并消费工作流任务数据。
具体地,生产任务和消费任务是通过消息队列的方式来实现,而消息队列具体可以是Redis消息队列(Redis消息队列指的是基于Redis数据存储的消息传递系统,用于可以实现生产者和消费者之间的异步通信,从而提高系统的并发性和可扩展性)。其中,Redis消息队列具体是使用基于Redis的List数据结构(即支持在列表的两端插入和删除元素双向链表结构)来存储消息,生产者和消费者是两个独立的进程,它们通过Redis服务器进行通信,生产者通过LPUSH命令(即用于将一个或多个值插入到列表key的头部的命令),将消息插入到List的头部,消费者则通过RPOP命令(即用于移除并返回列表key的最后一个元素的命令)从List的尾部取出消息,进而可通过Redis消息队列保证消息的顺序,实现先进先出的功能。
其中,任务生产消费的部分,具体包括以下处理步骤:
S1、创建队列
具体地,通过创建Redis消息队列,并利用Redis消息队列存储各工作流任务数据。
S2、生产者生成工作流任务数据
具体地,生产者根据任务信息生成工作流任务数据,根据与消息队列关联的第一处理指令,将各工作流任务数据按照存储规则依次存储至消息队列中。
其中,与消息队列关联的第一处理指令具体可以包括LPUSH命令(即用于将一个或多个值插入到列表key的头部的命令),即通过LPUSH命令将工作流任务数据插入到队列的左端(即头部)。
举例来说,“LPUSH orders_queue order1”命令,用于将工作流任务数据order1插入至队列orders_queue的左端。
S3、消费者消费工作流任务数据
消费者具体是根据与消息队列关联的第二处理指令,按照读取规则依次从消息队列中读取工作流任务数据。
其中,与消息队列关联的第二处理指令具体可以包括BRPOP命令(即列表的阻塞式弹出命令,会导致阻塞,直到队列中有数据可读取,而一旦有数据可读取,会返回从队列中读取到的工作流任务数据)。
具体地,通过使执行BRPOP命令,按照读取规则(即先进先出的规则)从队列的右端读取工作流任务数据。其中,执行BRPOP命令时会导致阻塞,即若消息队列中不存在可读取的工作流任务数据时不会执行后续操作,直到队列中有数据可读取,而一旦有数据可读取,BRPOP命令会返回从队列中读取到的工作流任务数据。
举例来说,“BRPOP orders_queue()”命令用于从消息队列orders_queue的右端读取工作流任务数据,且在消息队列orders_queue中不存在可读取的工作流任务数据时,出现堵塞,直至消息队列orders_queue中有数据可读取,并在有数据可读取时返回从队列中读取到的工作流任务数据。
S4、处理工作流任务数据
其中,在从消息队列中读取工作流任务数据后,还需调用工作流执行引擎创建与工作流任务数据对应的工作流实例,并通过执行工作流实例对应的各目标子任务,获得相应的子任务执行结果。
S5、确认处理完成
具体地,根据子任务执行结果生成确认信息,并将确认信息依次存储至所构建的确认信息队列中。
其中,具体可以采用RPUSH命令(即用于向存储在key中的列表的尾部插入所有指定的值的命令)将确认信息插入到队列的右端。
举例来说,“RPUSH orders_queue_processed order2”命令,用于将确认信息order2插入确认信息队列orders_queue_processed的右端。
S6、监测队列状态
具体地,针对消息队列的状态,即对队列中待处理的工作流任务数据的数量的状态监测,通过LLEN命令(即用于获取队列中未处理的工作流任务数据数量,返回队列长度的命令)实现。
举例来说,“LLEN orders_queue”命令用于返回消息队列orders_queue的队列长度,即获取消息队列中未处理的工作流任务数据数量。
P5、执行工作流(通过分布式的工作流引擎遵循DSL Json逻辑来执行工作流):
具体地,执行工作流的部分,具体包括以下处理步骤:
A1、创建工作流实例
具体地,通过调用工作流执行引擎,在工作流运行数据库中创建记录有工作流任务的任务编号、工作流编号、任务名称、执行对象、执行状态(比如未执行、执行中、以及执行结束等状态)、开始时间、结束时间、以及各子实例执行之间的流程关系的执行记录数据表。
进一步地,根据执行记录数据表、以及执行记录数据表中各字段的实际字段内容,比如任务编号的字段内容为“100001”、工作流编号的字段内容为“20002”、执行状态的字段内容为“未执行”、以及流程关系的字段内容为“第一跳子任务实例1-时间触发器、下一跳子任务实例2-执行XX脚本”等,得到与工作流任务数据对应的工作流实例。
A2、获取工作流实例信息
其中,与工作流实例对应的工作流实例信息,具体包括工作流实例对应的工作流名称、工作流实例所属的工作流编号、工作流包括的各子实例的实例名称、执行状态(比如未执行、执行中、以及执行结束等状态)、开始时间、结束时间、以及各子实例执行之间的流程关系等数据。
具体地,通过获取与工作流实例对应的工作流实例信息,包括工作流实例对应的工作流名称、工作流实例所属的工作流编号、工作流包括的各子实例的实例名称、子实例的参数配置信息、执行状态(比如未执行、执行中、以及执行结束等状态)、开始时间、结束时间、以及各子实例执行之间的流程关系等数据,并基于工作流实例信息进行信息筛选,识别并筛选出工作流实例包括的各子实例、各子实例的参数配置信息以及各子实例的前后跳转关系(比如当前某子实例的前一跳子实例、以及后一跳子实例),即得到与工作流实例关联的各子实例字段信息。
A3、获取子实例任务和设置状态
具体地,在获取与流程关系字段对应的子实例信息之后,进一步对子实例信息中各子实例任务的数据状态进行初始化,具体是初始化成为“未处理”或“待处理”的状态,即表明当前子实例信息对应的子实例任务为待处理。
其中,通过建立用于存储子实例任务的任务消息队列,将所获得的子实例任务依次存储至任务消息队列中。同时,通过获取工作流中的起始节点(即起始子实例)即时间触发器的子实例,并通过执行时间触发器的子实例,按照子实例任务的前后跳转关系,比如按照起始子实例、下一跳子实例、第三跳子实例……等子实例之间的前后跳转关系,依次将所获得的子实例任务依次存储至任务消息队列中。
进一步地,调用与任务消息队列关联的第二任务守护进程,按照执行时间依次从任务消息队列中读取子实例任务,并更新子实例任务对应的数据状态。
其中,与任务消息队列关联的第二任务守护进程,具体运行于工作流执行引擎中的不同容器(具体可以是docker容器,docker容器属于轻量级的虚拟化容器,可通过构建自定义的Docker镜像来打包应用程序和它的所有依赖项,然后将镜像直接部署到生产环境上)中。其中,通过运行第二任务守护进程,实时检测任务消息队列中是否存在可执行的子实例任务,若检测到任务消息队列中存在子实例任务,则依次从任务消息队列中读取子实例任务,并更新子实例任务对应的数据状态(具体是将子实例任务的数据状态设置为处理中),从而可将当前处理中的子实例任务和未处理(或待处理)的子实例任务进行区分,避免出现重复执行、或漏执行子实例任务的情况。
在一个实施例中,通过将数据状态更新后的各子实例字段信息加载至服务器的内存中,并根据子实例编号、各子实例字段信息(包括子实例编号、参数字段信息以及运行数据等),构建得到与子实例编号关联的映射全局变量结构数据,即每个子实例编号和其对应的子实例字段信息之间存在映射关系,通过利用子实例编号对与子实例编号关联的映射全局变量结构数据进行遍历和查询,即可获得与子实例编号对应的各子实例字段信息,从而可进一步从各子实例字段信息中确定出任务参数信息和运行数据。
具体地,若读取到待执行的子实例任务,则获取子实例任务对应的目标子实例编号,以目标子实例编号为索引,根据目标子实例编号遍历映射全局变量结构数据时,若匹配成功,即确定映射全局变量结构数据中存在目标子实例编号时,从映射全局变量结构数据中获取与目标子实例编号之间存在映射关系的子实例字段信息。
其中,子实例字段信息包括子实例编号、参数字段信息(即参数key字段、参数valve字段、参数类型字段以及参数描述字段等)、运行数据(包括运行输出、开始时间、结束时间、执行状态、以及报错信息等),则具体是从子实例字段信息中提取任务参数信息(包括参数名称、参数内容、参数类型等)和运行数据(包括输出结果、开始时间、结束时间、执行状态以及报错信息等)。
A4、解析路径语法表达式
具体地,对任务参数信息进行表达式解析处理以解析得到对应的路径语法表达式,并根据运行数据对路径语法表达式进行数据替换处理,以替换得到携带运行数据的待执行的目标子任务。
其中,任务参数信息即子实例的参数配置信息,具体采用<参数key,参数value,参数类型,参数描述>的方式进行表示。其中,参数key表示参数名称,参数value表示参数的具体参数内容,参数value可以是常量(比如数字或者字符串),也可以是使用路径语法表达式引用前面任意一个子实例的输出结果。参数类型指的是参数的数据类型,具体可以是string(字符串)、boolean(布尔类型)、以及number(数字)的类型,参数描述表示与配置参数对应的其他注释信息,比如对参数的类型和约束进行进一步描述和解释。
进一步地,参数value是使用路径语法表达式引用前面任意一个子实例的输出结果时,则需要对任务参数信息进行表达式解析处理以解析得到对应的路径语法表达式,进而通过利用运行数据对路径语法表达式进行数据替换处理,以在进行数据替换处理后使得相应子实例中包括实际执行时所需的具体运行数据,集得到的是携带运行数据的待执行的目标子任务。
其中,在需要获取当前参数的参数value时,若涉及多个层级或者多个存储路径套用的情况,比如存在当前子实例的参数的参数valve是上一跳子实例的输出结果,而上一跳子实例的参数是前面某一跳子实例的输出结果时,即存在多个层级或多个存储路径套用的情况,类似于需要获取某个文件夹中的文本文件,而该文件夹之上还嵌套有多个其他文件夹时,则需要获得所嵌套的每个文件夹的文件夹名称,得到该文本文件的访问路径,进而基于访问路径进行层层递进访问,获得所需的文本文件的情况。举例来说,子实例“ID2”的“parameter”即入参数组中的参数key值(即参数value)是子实例“ID1”的“data”即输出结果,则通过对路径语法表达式进行解析,并获取子实例“ID1”的输出结果“XXX”,通过将子实例“ID2”的参数key值(即参数value)替换为输出结果“XXX”,则获得执行子实例“ID2”时的实际参数key值,即获得可直接执行的、携带运行数据的目标子任务。
A5、执行目标子任务并入库
具体地,目标子任务为携带执行实际所需的运行数据的子任务,则可按照目标子任务的执行时间和调用关系将各目标子任务依次推送至子任务消息队列中,以便后续基于子任务消息队列依次读取并执行各目标子任务,直至各目标子任务执行结束,获得工作流任务处理结果。
其中,通过设置子任务消息队列,可将各目标子任务按照执行时间和调用关系(即前后跳转关系)依次推送至子任务消息队列中,从而利用子任务消息队列实现先进先出的目的,保障各目标子任务的准确执行,避免出现同时目标子任务遗漏执行的情况出现。
同样地,通过采用基于子任务消息队列依次读取并执行各目标子任务的方式,可保障各目标子任务按照工作流的流程关系准确执行,直至各目标子任务执行结束,以获得工作流任务处理结果。其中,目标子任务的运行数据包括目标子任务的执行状态、应用模板数据、开始时间、结束时间以及报错信息,则在对任务参数信息和运行数据进行表达式解析处理和执行数据替换处理,获得待执行的目标子任务之后,通过解析目标子任务对应的运行数据,获得目标子任务对应的应用模板数据。
其中,应用模板数据具体可以理解为对应子实例中使用的具体模板,比如“时间触发器”的子实例,其应用模板数据为“timer-trigger”即计时触发器,又比如“python脚本执行”的子实例,其应用模板数据为“python-script”即python脚本的应用模板数据。
具体来说,应用模板数据用于决定该目标子任务的具体运行逻辑,即可根据应用模板数据,确定出具体是需要调用哪个功能函数作为当前目标子任务的运行逻辑,则可通过对应用模板数据进行进一步解析以获得与目标子任务对应的功能函数。其中,对应用模板数据进行解析时,具体是通过对应用模板数据携带的功能函数进行解析和识别,解析得到该应用模板数据携带的功能函数,具体可以是一个功能函数或多个功能函数,也可以是多个功能函数联合得到的复合功能函数。
进一步地,解析各目标子任务对应的参数信息获得各参数字段、以及参数字段对应的参数内容,将参数字段对应的参数内容传入功能函数中,并执行功能函数以获得对应的子任务执行结果。
A6、判断执行实例是否结束
其中,执行完当前的目标子任务后,根据执行时间和调用关系(即前后跳转关系)确定出当前目标子任务的下一跳目标子任务,并执行下一跳目标子任务,依次类推,直至将各目标子任务均执行完,确定当前工作流处理完成。
具体地,在获得子任务执行结果后,根据各子任务执行结果生成确认信息,并将确认信息依次存储至确认信息队列中。其中,通过建立确认信息队列,将各确认信息按照确认信息的生成时间依次存储至确认信息队列中,并基于确认信息队列依次读取与各目标子任务对应的确认信息,从而达到保障确认信息是先进先出的状态,避免出现由于确认信息混乱导致无法准确根据确认信息对工作流实例信息中的任务状态数据进行更新的问题。
进一步地,基于确认信息队列,按照先进先出的读取规则依次读取与各目标子任务对应的确认信息,根据确认信息对工作流实例信息中的任务状态数据进行更新。其中,通过利用确认信息对工作流实例信息中的任务状态数据进行更新,并在确定工作流实例信息中的任务状态数据均更新时,即完成了对各目标子任务的执行时,确定各目标子任务执行结束,完成对当前工作流的处理,获得相应的工作流处理结果。
上述工作流任务处理方法中,通过获取待处理工作流的时间配置信息,并根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务,从而实现对待处理工作流下的各工作流任务进行统一转换、分配和执行。进一步地,若检测到满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据,并创建与工作流任务数据对应的工作流实例,进而可通过获取与工作流实例对应的工作流实例信息,以从工作流实例信息中筛选出与工作流实例关联的各子实例字段信息,从而可将工作流实例划分为多个子实例任务进行执行,提升任务处理效率。其中,通过对各子实例字段信息进行信息筛选以确定出与各子实例任务对应的任务参数信息和运行数据,从而可根据任务参数信息和运行数据进行表达式解析处理和执行数据替换处理,以获得待执行的目标子任务。进而通过按照各目标子任务的执行时间和调用关系分别执行各目标子任务,直至各目标子任务执行结束,以获得工作流任务处理结果,实现了对各目标子任务的并发执行,而无需局限于传统串行执行方式,提升了任务执行效率,从而可准确、快速获得任务执行结果,减少资源消耗并提升资源利用效率。
应该理解的是,虽然如上的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的工作流任务处理方法的工作流任务处理装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个工作流任务处理装置实施例中的具体限定可以参见上文中对于工作流任务处理方法的限定,在此不再赘述。
在一个实施例中,如图18所示,提供了一种工作流任务处理装置,包括:工作流任务转换模块1802、工作流实例创建模块1804、子实例字段信息筛选模块1806、目标子任务获得模块1808以及目标子任务执行模块1810,其中:
工作流任务转换模块1802,用于获取待处理工作流的时间配置信息,并根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务;
工作流实例创建模块1804,用于若检测到满足执行条件的工作流任务,获取与工作流任务对应的工作流任务数据,并创建与工作流任务数据对应的工作流实例;
子实例字段信息筛选模块1806,用于获取与工作流实例对应的工作流实例信息,并从工作流实例信息中,筛选出与工作流实例关联的各子实例字段信息;
目标子任务获得模块1808,用于基于各子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,对任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务;
目标子任务执行模块1810,用于按照各目标子任务的执行时间和调用关系分别执行各目标子任务,直至各目标子任务执行结束以获得工作流任务处理结果。
上述工作流任务处理装置中,通过获取待处理工作流的时间配置信息,并根据时间配置信息将待处理工作流转换成携带时间属性的各工作流任务,从而实现对待处理工作流下的各工作流任务进行统一转换、分配和执行。进一步地,若检测到满足执行条件的工作流任务,则获取与工作流任务对应的工作流任务数据,并创建与工作流任务数据对应的工作流实例,进而可通过获取与工作流实例对应的工作流实例信息,以从工作流实例信息中筛选出与工作流实例关联的各子实例字段信息,从而可将工作流实例划分为多个子实例任务进行执行,提升任务处理效率。其中,通过对各子实例字段信息进行信息筛选以确定出与各子实例任务对应的任务参数信息和运行数据,从而可根据任务参数信息和运行数据进行表达式解析处理和执行数据替换处理,以获得待执行的目标子任务。进而通过按照各目标子任务的执行时间和调用关系分别执行各目标子任务,直至各目标子任务执行结束,以获得工作流任务处理结果,实现了对各目标子任务的并发执行,而无需局限于传统串行执行方式,提升了任务执行效率,从而可准确、快速获得任务执行结果,减少资源消耗并提升资源利用效率。
在一个实施例中,工作流任务转换模块,还用于:若检测到工作流任务处理请求,获取与工作流任务处理请求对应的待处理工作流、以及待处理工作流携带的时间配置信息;根据时间配置信息确定与待处理工作流对应的执行时间周期;在预设工作周期内,按照各执行时间周期将待处理工作流转换成携带时间属性的各工作流任务;携带时间属性的工作流任务为在不同时间点重复执行的工作流任务。
在一个实施例中,工作流任务转换模块,还用于:根据执行时间周期确定待处理工作流在预设工作周期内的执行次数;基于执行时间周期和执行次数确定待处理工作流每次执行的时间点;将待处理工作流每次执行的时间点以及执行时间周期确定为待处理工作流的时间属性,得到携带时间属性的各工作流任务。
在一个实施例中,工作流实例创建模块,还用于:调用第一任务守护进程,基于存储有各工作流任务的任务数据库进行轮询处理;若检测到时间属性满足执行条件的工作流任务,获取与工作流任务对应的工作流任务数据;调用工作流执行引擎创建与工作流任务数据对应的工作流实例。
在一个实施例中,工作流实例创建模块,还用于:基于任务数据库进行工作流任务筛选,将时间属性与当前执行时间点匹配的各工作流任务确定为满足执行条件的工作流任务;获取满足执行条件的各工作流任务对应的任务信息,并根据任务信息生成工作流任务数据;创建消息队列,并根据与消息队列关联的第一处理指令,将各工作流任务数据按照存储规则依次存储至消息队列中;根据与消息队列关联的第二处理指令,按照读取规则依次从消息队列中读取工作流任务数据。
在一个实施例中,子实例字段信息筛选模块,还用于:基于工作流实例信息进行字段识别处理,以获得与工作流实例信息关联的各关键字段;从各关键字段中筛选出流程关系字段,获取与流程关系字段对应的子实例字段信息。
在一个实施例中,提供了一种工作流任务处理装置,还包括子实例任务读取模块,用于:初始化子实例信息中各子实例任务的数据状态,并将初始化后的子实例任务依次存储至任务消息队列中;调用与任务消息队列关联的第二任务守护进程,按照执行时间依次从任务消息队列中读取子实例任务,并更新子实例任务对应的数据状态;
目标子任务获得模块,还用于:获取更新后的子实例任务对应的子实例字段信息,并基于各子实例字段信息进行信息筛选,确定出与子实例任务对应的任务参数信息和运行数据。
在一个实施例中,提供了一种工作流任务处理装置,还包括映射全局变量结构数据构建模块,用于:将各子实例字段信息加载至内存中以构建得到与子实例编号关联的映射全局变量结构数据;映射全局变量结构数据用于确定出与子实例编号对应的任务参数信息和运行数据;
目标子任务获得模块,还用于:若读取到待执行的子实例任务,获取子实例任务对应的目标子实例编号;遍历映射全局变量结构数据,获得与目标子实例编号匹配的任务参数信息和运行数据。
在一个实施例中,目标子任务获得模块,还用于:对任务参数信息进行表达式解析处理以解析得到对应的路径语法表达式;根据运行数据对路径语法表达式进行数据替换处理,以替换得到携带运行数据的待执行的目标子任务。
在一个实施例中,目标子任务执行模块,还用于:解析目标子任务对应的运行数据以获得与目标子任务对应的应用模板数据;根据应用模板数据确定与目标子任务对应的功能函数;解析目标子任务对应的参数信息以获得各参数字段、以及参数字段对应的参数内容;将参数字段对应的参数内容传入功能函数中,并执行功能函数,获得子任务执行结果。
在一个实施例中,目标子任务执行模块,还用于:按照目标子任务的执行时间和调用关系将各目标子任务依次推送至子任务消息队列中;基于子任务消息队列依次读取并执行各目标子任务,直至各目标子任务执行结束以获得工作流任务处理结果。
在一个实施例中,提供了一种工作流任务处理装置,还包括任务状态数据更新模块,用于:
根据子任务执行结果生成确认信息,将确认信息依次存储至确认信息队列中;基于确认信息队列依次读取与各目标子任务对应的确认信息,并根据确认信息对工作流实例信息中的任务状态数据进行更新;其中,若确定工作流实例信息中的任务状态数据均更新,确定各目标子任务执行结束。
上述工作流任务处理装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图19所示。该计算机设备包括处理器、存储器、输入/输出接口(Input/Output,简称I/O)和通信接口。其中,处理器、存储器和输入/输出接口通过系统总线连接,通信接口通过输入/输出接口连接到系统总线。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质和内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储待处理工作流的时间配置信息、携带时间属性的各工作流任务、工作流任务数据、工作流实例、工作流实例信息、子实例字段信息、任务参数信息、运行数据、待执行的目标子任务、各目标子任务的执行时间和调用关系、以及工作流任务处理结果等数据。该计算机设备的输入/输出接口用于处理器与外部设备之间交换信息。该计算机设备的通信接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种工作流任务处理方法。
本领域技术人员可以理解,图19中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。
Claims (15)
1.一种工作流任务处理方法,其特征在于,所述方法包括:
获取待处理工作流的时间配置信息,并根据所述时间配置信息将所述待处理工作流转换成携带时间属性的各工作流任务;
若检测到满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据,并创建与所述工作流任务数据对应的工作流实例;
获取与所述工作流实例对应的工作流实例信息,并从所述工作流实例信息中筛选出与所述工作流实例关联的各子实例字段信息;
基于各所述子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,对所述任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务;
按照各所述目标子任务的执行时间和调用关系分别执行各所述目标子任务,直至各所述目标子任务执行结束以获得工作流任务处理结果。
2.根据权利要求1所述的方法,其特征在于,所述获取待处理工作流的时间配置信息,并根据所述时间配置信息将所述待处理工作流转换成携带时间属性的各工作流任务,包括:
若检测到工作流任务处理请求,获取与所述工作流任务处理请求对应的待处理工作流、以及所述待处理工作流携带的时间配置信息;
根据所述时间配置信息确定与所述待处理工作流对应的执行时间周期;
在预设工作周期内,按照各所述执行时间周期将所述待处理工作流转换成携带时间属性的各工作流任务;所述携带时间属性的工作流任务为在不同时间点重复执行的工作流任务。
3.根据权利要求2所述的方法,其特征在于,所述在预设工作周期内,按照各所述执行时间周期将所述待处理工作流转换成携带时间属性的各工作流任务,包括:
根据各所述执行时间周期确定所述待处理工作流在预设工作周期内的执行次数;
基于所述执行时间周期和所述执行次数确定所述待处理工作流每次执行的时间点;
将所述待处理工作流每次执行的时间点以及执行时间周期确定为所述待处理工作流的时间属性,以得到携带时间属性的各工作流任务。
4.根据权利要求1至3任意一项所述的方法,其特征在于,所述若检测到满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据,并创建与所述工作流任务数据对应的工作流实例,包括:
调用第一任务守护进程,基于存储有各所述工作流任务的任务数据库进行轮询处理;
若检测到所述时间属性满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据;
调用工作流执行引擎创建与所述工作流任务数据对应的工作流实例。
5.根据权利要求4所述的方法,其特征在于,所述若检测到所述时间属性满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据,包括:
基于所述任务数据库进行工作流任务筛选,将所述时间属性与当前执行时间点匹配的各工作流任务确定为满足执行条件的工作流任务;
获取所述满足执行条件的各工作流任务对应的任务信息,并根据所述任务信息生成工作流任务数据;
创建消息队列,并根据与所述消息队列关联的第一处理指令,将各所述工作流任务数据按照存储规则依次存储至所述消息队列中;
根据与所述消息队列关联的第二处理指令,按照读取规则依次从所述消息队列中读取所述工作流任务数据。
6.根据权利要求1至3任意一项所述的方法,其特征在于,从所述工作流实例信息中筛选出与所述工作流实例关联的各子实例字段信息,包括:
基于所述工作流实例信息进行字段识别处理,以获得与所述工作流实例信息关联的各关键字段;
从各所述关键字段中筛选出流程关系字段,获取与所述流程关系字段对应的子实例字段信息。
7.根据权利要求6所述的方法,其特征在于,在获取与所述流程关系字段对应的子实例信息之后,所述方法还包括:
初始化所述子实例信息中各所述子实例任务的数据状态,并将初始化后的所述子实例任务依次存储至所述任务消息队列中;
调用与所述任务消息队列关联的第二任务守护进程,按照执行时间依次从所述任务消息队列中读取子实例任务,并更新所述子实例任务对应的数据状态;
所述基于各所述子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,包括:
获取更新后的所述子实例任务对应的子实例字段信息,基于各所述子实例字段信息进行信息筛选,确定出与所述子实例任务对应的任务参数信息和运行数据。
8.根据权利要求7所述的方法,其特征在于,在所述从各所述子实例字段信息,确定出与各子实例任务对应的任务参数信息和运行数据之前,所述方法还包括:
将各子实例字段信息加载至内存中以构建得到与子实例编号关联的映射全局变量结构数据;所述映射全局变量结构数据用于确定出与所述子实例编号对应的任务参数信息和运行数据;
基于各所述子实例字段信息进行信息筛选,确定出与所述子实例任务对应的任务参数信息和运行数据,包括:
若读取到待执行的子实例任务,获取所述子实例任务对应的目标子实例编号;
遍历所述映射全局变量结构数据,获得与所述目标子实例编号匹配的任务参数信息和运行数据。
9.根据权利要求1至3任意一项所述的方法,其特征在于,对所述任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务,包括:
对所述任务参数信息进行表达式解析处理以解析得到对应的路径语法表达式;
根据所述运行数据对所述路径语法表达式进行数据替换处理,以替换得到携带所述运行数据的待执行的目标子任务。
10.根据权利要求1至3任意一项所述的方法,其特征在于,执行所述目标子任务的方式,包括:
解析所述目标子任务对应的运行数据以获得与所述目标子任务对应的应用模板数据;
根据所述应用模板数据确定与所述目标子任务对应的功能函数;
解析所述目标子任务对应的参数信息以获得各参数字段、以及参数字段对应的参数内容;
将所述参数字段对应的参数内容传入所述功能函数中,并执行所述功能函数,获得子任务执行结果。
11.根据权利要求10所述的方法,其特征在于,所述按照各所述目标子任务的执行时间和调用关系分别执行各所述目标子任务,直至各所述目标子任务执行结束以获得工作流任务处理结果,包括:
按照所述目标子任务的执行时间和调用关系将各所述目标子任务依次推送至子任务消息队列中;
基于所述子任务消息队列依次读取并执行各所述目标子任务,直至各所述目标子任务执行结束以获得工作流任务处理结果。
12.根据权利要求10所述的方法,其特征在于,在获得子任务执行结果后,所述方法还包括:
根据所述子任务执行结果生成确认信息,将所述确认信息依次存储至确认信息队列中;
基于所述确认信息队列依次读取与各目标子任务对应的确认信息,并根据所述确认信息对所述工作流实例信息中的任务状态数据进行更新;其中,若确定所述工作流实例信息中的任务状态数据均更新,确定各所述目标子任务执行结束。
13.一种工作流任务处理装置,其特征在于,所述装置包括:
工作流任务转换模块,用于获取待处理工作流的时间配置信息,并根据所述时间配置信息将所述待处理工作流转换成携带时间属性的各工作流任务;
工作流实例创建模块,用于若检测到满足执行条件的工作流任务,获取与所述工作流任务对应的工作流任务数据,并创建与所述工作流任务数据对应的工作流实例;
子实例字段信息筛选模块,用于获取与所述工作流实例对应的工作流实例信息,并从所述工作流实例信息中,筛选出与所述工作流实例关联的各子实例字段信息;
目标子任务获得模块,用于基于各所述子实例字段信息进行信息筛选,确定出与各子实例任务对应的任务参数信息和运行数据,对所述任务参数信息和运行数据进行表达式解析处理和执行数据替换处理以获得待执行的目标子任务;
目标子任务执行模块,用于按照各所述目标子任务的执行时间和调用关系分别执行各所述目标子任务,直至各所述目标子任务执行结束以获得工作流任务处理结果。
14.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至12中任一项所述的方法的步骤。
15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至12中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310802031.8A CN116841758A (zh) | 2023-06-30 | 2023-06-30 | 工作流任务处理方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310802031.8A CN116841758A (zh) | 2023-06-30 | 2023-06-30 | 工作流任务处理方法、装置、计算机设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116841758A true CN116841758A (zh) | 2023-10-03 |
Family
ID=88172085
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310802031.8A Pending CN116841758A (zh) | 2023-06-30 | 2023-06-30 | 工作流任务处理方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116841758A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117609102A (zh) * | 2024-01-23 | 2024-02-27 | 云筑信息科技(成都)有限公司 | 一种建筑产业互联网造数平台系统测试方法 |
-
2023
- 2023-06-30 CN CN202310802031.8A patent/CN116841758A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117609102A (zh) * | 2024-01-23 | 2024-02-27 | 云筑信息科技(成都)有限公司 | 一种建筑产业互联网造数平台系统测试方法 |
CN117609102B (zh) * | 2024-01-23 | 2024-05-28 | 云筑信息科技(成都)有限公司 | 一种建筑产业互联网造数平台系统测试方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10901791B2 (en) | Providing configurable workflow capabilities | |
CN108920259B (zh) | 深度学习作业调度方法、系统和相关设备 | |
CN110245008B (zh) | 定时任务处理方法、系统和设备 | |
US8799230B2 (en) | Method and system for centralized issue tracking | |
US8959518B2 (en) | Window-based scheduling using a key-value data store | |
CN110569090A (zh) | 一种数据处理方法、装置、电子设备及存储介质 | |
CN116841758A (zh) | 工作流任务处理方法、装置、计算机设备和存储介质 | |
CN109284324A (zh) | 基于Apache Oozie框架处理大数据的流程任务的调度装置 | |
CN110908793A (zh) | 长时任务执行方法、装置、设备及可读存储介质 | |
van Dongen et al. | EMiT: A process mining tool | |
US9996344B2 (en) | Customized runtime environment | |
US20080255908A1 (en) | Generic framework for resource modeling | |
CN110365809B (zh) | 分布式服务器地址配置系统及方法 | |
US11086696B2 (en) | Parallel cloned workflow execution | |
US11262986B2 (en) | Automatic software generation for computer systems | |
US10922145B2 (en) | Scheduling software jobs having dependencies | |
CN111274013A (zh) | 容器内基于内存数据库的定时任务调度的优化方法及系统 | |
US20070074225A1 (en) | Apparatus, method and computer program product providing integration environment having an integration control functionality coupled to an integration broker | |
CN114924858A (zh) | 任务调度方法及装置、存储介质及电子设备 | |
CN111782373A (zh) | 作业调度方法及装置 | |
EP4375834A1 (en) | Apparatus and method for deploying onboarded applications in a radio access network controller | |
Yahia | A language-based approach for web service composition | |
CN116880992A (zh) | 一种任务处理系统、方法、装置、电子设备及存储介质 | |
Laurent | A Language-Based Approach for Web Service Composition | |
CN118012577A (zh) | 任务调度方法和装置、计算设备、存储介质及程序产品 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |