CN101996091A - 实现支持多种流程运行的图形执行虚拟机系统及其方法 - Google Patents
实现支持多种流程运行的图形执行虚拟机系统及其方法 Download PDFInfo
- Publication number
- CN101996091A CN101996091A CN2010105332221A CN201010533222A CN101996091A CN 101996091 A CN101996091 A CN 101996091A CN 2010105332221 A CN2010105332221 A CN 2010105332221A CN 201010533222 A CN201010533222 A CN 201010533222A CN 101996091 A CN101996091 A CN 101996091A
- Authority
- CN
- China
- Prior art keywords
- behavior
- scheduling device
- nodes
- node
- context
- 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.)
- Granted
Links
Images
Landscapes
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明涉及一种实现支持多种流程运行的图形执行虚拟机系统,其中包括外观控制器、上下文容器、节点行为注册器、核心调度器和单元调度器,核心调度器分别与外观控制器和上下文容器连接,单元调度器分别与上下文容器、节点行为注册器、核心调度器连接。本发明还涉及一种基于该系统实现支持多种流程运行的图形执行虚拟机的方法。采用该种实现支持多种流程运行的图形执行虚拟机系统及方法,有助于快速开发出稳定可靠的流程引擎产品,提高了软件重用度,节省了工作量,降低了模块耦合度,提高并行开发能力,提高了流程引擎的扩展性,有效避免了少量变动引起流程引擎的不稳定,提高了流程引擎的稳定性和易维护性,降低了维护成本,适用范围较为广泛。
Description
技术领域
本发明涉及计算机软件领域,特别涉及支持以图形为基础的流程运行的基础设施技术领域,具体是指一种实现支持多种流程运行的图形执行虚拟机系统及其方法。
背景技术
随着现代社会科学技术的发展,计算机软件得到了越来越广泛的应用。早期的计算机软件中的计算流程全部是使用代码编写的,相对而言,代码比较晦涩难懂,不便于维护和业务重构,运营成本很高。随着计算机硬件的计算速度的快速提高以及计算机软件业的飞速发展,可视化的流程在计算流程中发挥着越来越重要的作用,替代了一部分以前通过代码才能实现的业务流转机制,流程可以大致分为以下几类:
(1)工作流(WorkfloW)
工作流是最早得到广泛应用的流程形式,目前在OA领域以及应用内的流程控制中在继续发挥着主导作用。工作流管理联盟(WfMC)组织定义了完整的工作流体系结构,人们通过流程定义工具以图形化方式定义流程;通过流程引擎运转来推进和协调企业不同岗位的工作,并可以和企业的自动业务逻辑进行交互。
(2)业务流程管理(BPM)
在业务流程重组(BPR)过程中,人们借助BPM工具来搭建企业流程。与传统工作流相比,BPM具备更多面向业务方面的能力,同时也具备更多的应用集成能力。BPM侧重点不在进行应用内的人工工作协调,它强调系统之间的交互,强调流程管理带来的投资回报(ROI)。BPM相关协议包含BPMN、XPDL、BPEL、WSFL等。
(3)页面流(PageFlow)
目前基于B/S结构的企业应用大部分采用MVC的方式来开发,页面流是作为控制层经常被采用的实现方式之一。页面流中的活动包括页面和自动业务逻辑,页面流控制机制协调用户在应用中多个页面的切换。
(4)业务流、规则流等
业务流以及规则流是对一次计算的流程化展示。业务流把执行中的多个活动按照一定的顺序串联起来,产生特定的业务操作结果;规则流通过比较一系列的规则变量,得到一个判定结果。
目前,已经有不少流程产品可以用来支撑各种类别流程的建模和执行,给业务用户和技术开发用户提供了不少便利。但总体而言,流程应用的规模还不大,流程在企业活动中还有很大的发展空间。
流程引擎是流程应用的核心功能,但是成功的流程引擎本身的研发一直是复杂的、高难度的。这是因为流程引擎本身的研发涉及串行、选择、归并、循环等多种复杂的流程模式的实现,还涉及各种类型流程环节相关的复杂的规则和算法,并且还要应对流程引擎作为系统的核心调度机制所必须具备的高可靠性要求。流程引擎研发中实际困难具体体现:
(1)由于流程引擎的各种调度机制之间高度耦合,所以往往是只有少量能力强的工程师复可参与,难以实现多开发人员并行工作,开发周期长。
(2)流程引擎的功能修改困难,功能的扩展往往需要修改已有的功能,往往一点点修改或者扩展就造成全局性的影响。
(3)由于逻辑复杂,源程序代码难以阅读和理解,代码移交困难。
总之,目前业界对于流程引擎的研发存在较大瓶颈,需要有一种更好机制来避免流程引擎研发的问题,提高研发效率。
发明内容
本发明的目的是克服了上述现有技术中的缺点,提供一种能够有效提高流程产品的松耦合能力和可扩展能力、提高开发效率、增强系统稳定可靠性、适用范围较为广泛的实现支持多种流程运行的图形执行虚拟机系统及其方法。
为了实现上述的目的,本发明的实现支持多种流程运行的图形执行虚拟机系统及其方法如下:
该实现支持多种流程运行的图形执行虚拟机系统,其主要特点是,所述的系统包括:
外观控制器,负责图形执行虚拟机的启动、加载和停止,并接收外部请求的响应,调用其他部件处理请求;
上下文容器,维护节点行为处理过程中可以访问的上下文,确保用户获取到当前的执行单元、以及当前的执行队列;
节点行为注册器,维护一个不同类型节点行为的注册表;
核心调度器,分别与所述的外观控制器和上下文容器相连接,对所述的外观控制器传递过来的每一个请求分配一个线程进行调度;
单元调度器,分别与所述的上下文容器、节点行为注册器、核心调度器相连接,接收所述的核心调度器的请求,进行一次执行。其中每一次执行,先从所述的节点行为注册器中获取对应的节点的行为实现类,再从所述的上下文容器中获取对应的上下文,并传入上下文调用节点行为的对应方法。
该实现支持多种流程运行的图形执行虚拟机系统中的核心调度器包括:
核心调度线程池,用于容纳该核心调度器所分配的线程;
执行队列处理器,分别与所述的核心调度线程池和单元调度器相连接,对应一个线程的实现,从执行上下文获取执行队列,并依次处理该执行队列中的每一个执行单元,对于每一个执行单元,该执行队列处理器调用所述的单元调度器进行处理。
该基于上述的系统实现支持多种流程运行的图形执行虚拟机的方法,其主要特点是,所述的方法包括图形执行虚拟机启动操作、图形执行虚拟机请求处理操作和图形执行虚拟机停止操作,所述的图形执行虚拟机启动操作,包括以下步骤:
(11)所述的外观控制器检查系统引擎的状态,并对系统引擎的启动过程进行加锁;
(12)所述的外观控制器创建节点行为注册器,并调用节点注册器的初始化;
(13)所述的外观控制器创建上下文容器;
(14)所述的外观控制器创建单元调度器;
(15)所述的外观控制器创建核心调度器,并调用核心调度器的初始化;
(16)解锁并标记该图形执行虚拟机启动完成,系统可接收外部请求;
所述的图形执行虚拟机请求处理操作,包括以下步骤:
(21)所述的外观控制器从外部请求中获取IGraph参数、INode参数、处理阶段参数,并组装成指令对象;
(22)所述的外观控制器调用该核心调度器对该外部请求进行处理;
所述的图形执行虚拟机停止操作,包括以下步骤:
(31)校验系统引擎的状态,对该系统引擎的停止过程进行加锁;
(32)所述的外观控制器调用该核心调度器的停止动作;
(33)取消所述的节点行为注册器中各个已注册的节点行为;
(34)所述的外观控制器调用清空所述的上下文容器中当前的上下文;
(35)标记该系统引擎状态为已停止。
该实现支持多种流程运行的图形执行虚拟机的方法中的外观控制器创建节点行为注册器并调用节点注册器的初始化,包括以下步骤:
(121)所述的外观控制器创建节点行为注册器对象;
(122)所述的节点行为注册器创建节点行为缓存映射结构;
(123)所述的节点行为注册器从配置文件获取各类型节点行为实现类,创建类的实例,并加载到缓存映射结构当中。
该实现支持多种流程运行的图形执行虚拟机的方法中的外观控制器创建核心调度器并调用核心调度器的初始化,包括以下步骤:
(151)所述的外观控制器创建所述的核心调度器;
(152)所述的核心调度器创建核心调度线程池;
(153)所述的核心调度器从该外观控制器获取并设置好对应的上下文容器;
(154)所述的核心调度器启动对应的核心调度线程池,准备好接收外部请求。
该实现支持多种流程运行的图形执行虚拟机的方法中的外观控制器调用该核心调度器对该外部请求进行处理,包括以下步骤:
(221)所述的核心调度器调用所述的上下文容器的创建方法,创建请求上下文;
(222)所述的核心调度器把上下文编号ID传递给核心调度线程池,所述的核心调度线程池选择一个线程执行该外部请求。
该实现支持多种流程运行的图形执行虚拟机的方法中的核心调度线程池中被选择的线程为处理线程,所述的线程的执行该外部请求,包括以下步骤:
(41)所述的处理线程从所述的上下文容器获取到对应的上下文,作为当前上下文;
(42)所述的处理线程判断当前上下文是否还有更多的指令;
(43)如果是,则调用所述的单元调度器的处理过程,并传入上下文ID;
(44)如果否,则对该外部请求的处理已经完成,并退出;
(45)重复上述步骤(42)。
该实现支持多种流程运行的图形执行虚拟机的方法中的调用单元调度器的处理过程并传入上下文ID,包括以下步骤:
(431)所述的单元调度器从该上下文容器中获取到对应的上下文;
(432)所述的单元调度器从步骤(431)中获取到的上下文中获取下一个指令,作为当前指令;
(433)所述的单元调度器判断当前的指令的类型;
(434)如果该可执行请求是Perform类型,则所述的单元调度器运行自己的执行过程;
(435)如果该可执行请求是Transmit类型,则所述的单元调度器执行自己的传送过程。
该实现支持多种流程运行的图形执行虚拟机的方法中的单元调度器运行自己的执行过程,包括以下步骤:
(4341)所述的单元调度器从节点注册器获取到适合于当前处理指令的节点行为实现对象,作为当前节点行为;
(4342)所述的单元调度器调用当前节点行为对象的执行前方法,触发对应的用户定制行为,并传入当前上下文;
(4343)所述的单元调度器调用当前节点行为对象的执行方法,触发用户定义的节点动作,并传入当前上下文;
(4344)所述的单元调度器调用当前节点行为对象的执行后行为,触发对应的用户定制行为,并传入当前上下文;
(4345)所述的单元调度器获取执行上下文的“是否继续”属性;
(4346)如果该属性为“不继续”,则直接退出,并返回步骤(45);
(4347)如果该属性为“继续”,则调用当前节点行为的获取后继方法,获取到后续节点;
(4348)所述的单元调度器记录当前可执行请求处理完成的日志。
该实现支持多种流程运行的图形执行虚拟机的方法中的步骤(4347)之后还包括以下处理步骤:
(a)循环为获取到的后续节点产生迁移类型的指令,并追加到当前上下文的执行队列当中。
该实现支持多种流程运行的图形执行虚拟机的方法中的单元调度器执行自己的传送过程,包括以下步骤:
(4351)所述的单元调度器从节点注册器获取适合于当前处理指令的节点行为实现对象,作为当前节点行为;
(4352)所述的单元调度器通过调用当前节点行为对象的迁移前方法,触发对应的用户定制行为;
(4353)所述的单元调度器通过调用当前节点行为对象迁移传送动作,获取到后续节点列表,并判断是否能够获取到;
(4354)如果否,则当前节点是图中最后一个节点,也即结束节点,查找该节点的父节点,且该单元调度器为父节点产生一个新的指令,加入到当前上下文的执行队列当中,指定执行阶段为结束;
(4355)如果是,则当前节点是一个中间节点,所述的单元调度器顺次为后续节点创建新的指令,加入到当前上下文的执行队列当中;
(4356)所述的单元调度器记录当前指令处理完成的日志。
该实现支持多种流程运行的图形执行虚拟机的方法中的节点行为为分阶段节点行为,所述的单元调度器运行自己的执行过程,包括以下步骤:
(51)所述的分阶段节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段信息;
(52)如果执行阶段是开始,则进行开始阶段操作处理;
(53)如果执行阶段是指令,则进行指令阶段操作处理;
(54)如果执行阶段是结束,则进行结束阶段操作处理。
该实现支持多种流程运行的图形执行虚拟机的方法中的进行开始阶段操作处理,包括以下步骤:
(521)所述的分阶段节点行为设定指令上下文ExecutionContext的继续运行属性为真;
(522)所述的分阶段节点行为调用节点开始动作;
(523)所述的单元调度器判断是否继续;
(524)如果是,则设定下一个命令为执行,并继续回到开始的判断;如果否,则退出。
该实现支持多种流程运行的图形执行虚拟机的方法中的进行指令阶段操作处理,包括以下步骤:
(531)所述的分阶段节点行为设定指令上下文ExecutionContext继续运行属性为真;
(532)所述的分阶段节点行为调用节点执行动作;
(533)所述的单元调度器判断是否继续;
(534)如果是,则设定下一个命令为结束,继续回到开始的判断;如果否,则退出。
该实现支持多种流程运行的图形执行虚拟机的方法中的结束阶段操作处理,包括以下步骤:
(541)所述的分阶段节点行为设定指令上下文ExecutionContext继续运行属性为真;
(542)所述的分阶段节点行为调用节点完成动作;
(543)结束阶段处理完毕,退出执行。
该实现支持多种流程运行的图形执行虚拟机的方法中的节点行为为块节点行为,所述的块节点行为的父类为分阶段节点行为,所述的单元调度器运行自己的执行过程,包括以下步骤:
(61)所述的块节点行为调用分阶段节点行为的步骤(51)至(54);
(62)所述的块节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段信息;
(63)如果该执行阶段信息不是执行,则直接退出;
(64)如果该执行阶段信息是执行,则所述的块节点行为获取已经设定的开始节点;
(65)所述的块节点行为对获取到的开始节点创建新的执行单元指令;
(66)所述的块节点行为把新创建的指令加入到当前执行上下文的执行队列当中,并完成。
该实现支持多种流程运行的图形执行虚拟机的方法中的外观控制器调用核心调度器的停止动作,包括以下步骤:
(321)所述的核心调度器给核心调度线程池发送中断信号,停止各线程工作;
(322)所述的核心调度器销毁该核心调度线程池对象。
采用了该发明的实现支持多种流程运行的图形执行虚拟机系统及其方法,由于其中对基于图形的流程产品的引擎进行了抽象,提取出了图形调度机制,实现了图形执行虚拟机GEVM,该图形执行虚拟机GEVM可以提高流程产品的松耦合能力和可扩展能力,有助于快速开发出稳定可靠的流程引擎产品,从软件技术上抽象出了可供多种流程实现的基础调度公共机制,减少了流程引擎开发的工作量,提高了软件重用度,节省了工作量;同时通过GEVM主动加载各种节点插件行为的方法,各种节点行为之间开发不存在任何必然依赖性,流程引擎的各个部分可以交给不同技能的人去实现,降低了流程引擎的实现门槛,降低了模块耦合度,提高并行开发能力;而且基于GEVM可以以开发扩展“插件”的形式扩充引擎的能力;对于新增节点功能只需要实现一些新的扩展插件即可,提高了流程引擎的扩展性;不仅如此,一般的功能的变更只局限在特定的节点插件当中,有效避免了少量变动引起整个流程引擎的不稳定,提高了流程引擎的稳定性和易维护性,降低了维护成本,适用范围较为广泛。
附图说明
图1为本发明的实现支持多种流程运行的图形执行虚拟机系统中的基于流程执行框架GEVM的流程引擎的结构示意图。
图2为本发明的实现支持多种流程运行的图形执行虚拟机系统中的GEVM框架的各主要组成部分以及各部分之间的关系示意图。
图3为本发明的实现支持多种流程运行的图形执行虚拟机的方法中基于GEVM抽象的各类节点、各类节点之间的行为以及关系。
图4为本发明的实现支持多种流程运行的图形执行虚拟机的方法中的块活动示意图。
图5为本发明的实现支持多种流程运行的图形执行虚拟机的方法中的GEVM框架主要概念类图。
具体实施方式
为了能够更清楚地理解本发明的技术内容,特举以下实施例详细说明。
请参阅图1和图2所示,该实现支持多种流程运行的图形执行虚拟机系统,其中包括:
外观控制器,负责图形执行虚拟机的启动、加载和停止,并接收外部请求的响应,调用其他部件处理请求;
上下文容器,维护节点行为处理过程中可以访问的上下文,确保用户获取到当前的执行单元、以及当前的执行队列;
节点行为注册器,维护一个不同类型节点行为的注册表;
核心调度器,分别与所述的外观控制器和上下文容器相连接,对所述的外观控制器传递过来的每一个请求分配一个线程进行调度;其中包括:
●核心调度线程池,用于容纳该核心调度器所分配的线程;
●执行队列处理器,分别与所述的核心调度线程池和单元调度器相连接,对应一个线程的实现,从执行上下文获取执行队列,并依次处理该执行队列中的每一个执行单元,对于每一个执行单元,该执行队列处理器调用所述的单元调度器进行处理。
单元调度器,分别与所述的上下文容器、节点行为注册器、核心调度器相连接,接收所述的核心调度器的请求,进行一次执行,其中每一次执行,先从所述的节点行为注册器中获取对应的节点的行为实现类,再从所述的上下文容器中获取对应的上下文,并传入上下文调用节点行为的对应方法。
在实际使用当中,针对现有技术中的流程引擎研发中的各种问题和困难,其中的关键点在于没有把“流程图运转”本身的控制逻辑与“流程环节的具体业务内涵”处理区分开来。因此,针对所有以“图形运转”为基础的流程系统,本发明的基本思想是一种可用于支撑多种流程运行的图形执行虚拟机(Graph Execution Virtual Machine,下文简称GEVM)的实现方法,具体的流程实现可以通过扩展的方式把流程的业务行为扩展到GEVM中,通过二者结合完成完整的流程调度目标。
对于GEVM为何可降低流程引擎实现的复杂度和风险,请参阅图1所示。GEVM作为“图形”执行的基础设施,提供扩展接口供具体的节点做扩展。通过GEVM,各个环节以相对独立的方式实现自己的职责,针对背景技术中描述的几个问题,解决的情况如下:
(1)各种活动插件都依赖于GEVM,避免了各种活动实现之间的强依赖性,有效解决了流程引擎各个部分紧密耦合的问题,有利于实现并行开发。各种活动的调度分别可以安排不同的开发人员独立研发。同时,GEVM本身的可重用性也可节省一部分工作量。
(2)如果流程需要有功能修改,只需要修改单个“活动扩展插件”即可,不会造成全局影响;如果需要增加一些活动类型的支持,只需要要增加和注册对应的插件即可。
(3)由于GEVM的作用,各种类型的环境的行为机制相互独立,减轻了代码的耦合度,代码易读易维护。
GEVM作为图形处理虚拟机,其中定义了一些抽象的模型,分别表示节点、分阶段节点、块节点、图等基本数据结构。另外包含若干基本部件,这些部件基于这些数据结构相互协作推进各个节点的执行。下面先描述基本工作原理;再描述主要部件;然后描述各部件的工作过程。
GEVM基本工作原理如下:
无论是哪一种流程,只要是以图为基础的流程,都符合图执行的基本原则。图的基本组成单位是节点;由于图中的节点也可能是块(块包含一到多个节点),所以GEVM中块节点也是一种特殊的节点;图可以看作不属于任何上级图的块节点,所以在GEVM中图也是为一种特殊的节点。(具体请参阅图1所示)
本发明的GEVM的具体实施方案中用到的基础数据概念如下:
节点(Node):节点是GEVM调度的基本单位,也就是说GEVM调度的对象是节点。节点是分类型的,各类型节点提供其对应的行为接口,环节扩展插件都扩展节点提供的接口。在业务流程领域,节点对应一种活动,比如“人工活动”。
分阶段节点(StagedNode):分阶段节点是一种特殊的节点,支持在节点运行期间进行中断,然后在适当的时机继续运行。分阶段节点可以分为开始、执行、完成三个阶段。人工环节是一种典型的分阶段节点,人工任务创建完毕以后流程即暂停,等待任务处理完毕以后再通知流程继续执行。
块节点(BlockNode):块节点是一种特殊的“分阶段节点”。块节点在运行的时候暂停自己的工作,转而去执行块中的节点。等块中包含的节点(可以内嵌子流程)全部运行完毕以后,再推动块节点继续执行后续节点。块节点可以包含其他节点,包含的节点也可以是块节点。在业务流程领域,块节点对应块活动(或称为内嵌子流程)
图(Graph):图也是一种节点,并且是一种特殊的块节点。图中可以包含各种类型的节点。在业务流程领域,图对应到一个完整的流程。
执行单元(Execution):执行单元代表GEVM的一个基本处理单位,一个节点的处理会产生两个执行单元,分别是类型为Perform类型和Transmit类型。Perform类型的Execution负责处理节点本身的业务职能(比如:发送一个消息),Transmit类型负责计算节点将要迁移到的后续节点。
执行队列(ExecutionQueue):执行队列是执行单元(Execution)组成的一个队列,节点扩展插件在工作过程中可以从执行上下文中获取到执行队列,并可对往执行队列中加入新的执行单元(Execution)。GEVM会获取到新增的Execution,并依次进行处理。
以上各概念的类图请参阅图5所示。
GEVM提供一种可扩展性的框架,用户可以基于该框架进行扩展,用户扩展的实现方式针对不同类型的节点扩展不同的节点行为。下面为节点行为的种类。(具体请参阅图3所示)
1、基本节点行为(INodeBehavior)
图的执行是令牌顺着有向图的正向路径依次传递的过程,这便决定了图中节点的基本行为是“执行(perform)”和“转移(transmit)”。
(1)“执行”完成节点自身的行为,比如“调用一个WEB服务”、“创建子流程”、“创建人工任务——等待任务执行——完成”。
(2)“转移”过程中,节点会提供转移的目标(后续活动),框架支持对后续活动的运行。
2、分阶段节点行为(StagedNodeBehavior)
很多情况下,节点的“操作”行为是分阶段进行的,节点可能在运行过程中暂停,过一段时间再继续。为了应对这种情况,引入“分阶段节点行为”。每一个阶段运行完毕以后都可以暂停或继续,整个活动可能持续很长一段时间。在业务流程中执行的阶段包括“启动(start)”、“执行(execute)”、“完成(finish)”。
(1)“启动”过程一般可完成对实例的创建和激活等动作。启动以后可暂停等待,也可直接运行。
(2)“执行”过程中实例进入运行状态,并执行对应的业务动作。运行以后可暂停等待,也可直接进入“完成”。
(3)“完成”以后实例进入完成状态。完成以后可直接开始“转移”也可暂停等待。
GEVM框架就是按照以上的节点行为特点,按照拓扑顺序调用每一个节点的行为,从而达到推进图的执行的目的。
3、块节点行为(BlockNodeBehavior)
块节点有其特殊性,块节点运行到的时候,不会立即运行到后续活动,而是去执行块内的活动,所以块节点行为是一种特殊的分阶段节点行为,并且在执行过程中需要提供需要从块中哪一个节点开始运行。(参见图3)
构成GEVM的主要部件如下:
(1)外观控制器(EngineInstance):外观控制器负责GEVM的启动、加载和停止,并接收外部请求的响应,并调用其他部件处理请求。在外部调用者看来,外观控制器代表GEVM引擎。(该部件之所以叫做“外观控制器”是因为这里采用了Facade设计模式,外观控制器对外代表引擎)
(2)核心调度器(KernelProcessor):核心调度器维护一个线程池,对“外观控制器”传递过来的每一个请求分配一个线程进行调度。线程池中每一个线程的实现,都是一个执行队列处理器,从执行上下文获取执行队列,并依次处理队列中的每一个执行单元。对与每一个执行单元,执行队列处理器会调用单元调度器进行处理。
(3)单元调度器(ExecutionHandler):单元调度器接收核心调度器的请求,进行一次执行。单元调度器的每一次执行,先从节点注册器获取对应的节点的行为实现类,再从上下文容器中获取对应的上下文容器,然后传入上下文调用节点行为的对应方法。
(4)上下文容器(ExecutionContext):上下文容器维护节点行为处理过程中可以访问的上下文(Context),用户可以从ExecutionContext中获取到当前的执行单元,以及当前的执行队列。
(5)节点注册器(BehaviorRegistry):节点注册器维护一个不同类型节点行为的注册表,单元调度器每一次调度都首先从这里获取对应的节点实现类。
以上各部件及其关系请参阅图2所示。
再请参阅图3至图5所示,该基于上述的系统实现支持多种流程运行的图形执行虚拟机的方法,其主要特点是,所述的方法包括图形执行虚拟机启动操作、图形执行虚拟机请求处理操作和图形执行虚拟机停止操作,所述的图形执行虚拟机启动操作,包括以下步骤:
(11)所述的外观控制器检查系统引擎的状态,并对系统引擎的启动过程进行加锁;
(12)所述的外观控制器创建节点行为注册器,并调用节点注册器的初始化,包括以下步骤:
(a)所述的外观控制器创建节点行为注册器对象;
(b)所述的节点行为注册器创建节点行为缓存映射结构;
(c)所述的节点行为注册器从配置文件获取各类型节点行为实现类,创建类的实例,并加载到缓存映射结构当中;
(13)所述的外观控制器创建上下文容器;
(14)所述的外观控制器创建单元调度器;
(15)所述的外观控制器创建核心调度器,并调用核心调度器的初始化,包括以下步骤:
(a)所述的外观控制器创建所述的核心调度器;
(b)所述的核心调度器创建核心调度线程池;
(c)所述的核心调度器从该外观控制器获取并设置好对应的上下文容器;
(d)所述的核心调度器启动对应的核心调度线程池,准备好接收外部请求;
(16)解锁并标记该图形执行虚拟机启动完成,系统可接收外部请求;
所述的图形执行虚拟机请求处理操作,包括以下步骤:
(21)所述的外观控制器从外部请求中获取IGraph参数、INode参数、处理阶段参数,并组装成指令对象;
(22)所述的外观控制器调用该核心调度器对该外部请求进行处理,包括以下步骤:
(a)所述的核心调度器调用所述的上下文容器的创建方法,创建请求上下文;
(b)所述的核心调度器把上下文编号ID传递给核心调度线程池,所述的核心调度线程池选择一个线程执行该外部请求;该核心调度线程池中被选择的线程为处理线程,所述的线程的执行该外部请求,包括以下步骤:
(i)所述的处理线程从所述的上下文容器获取到对应的上下文,作为当前上下文;
(ii)所述的处理线程判断当前上下文是否还有更多的指令;
(iii)如果是,则调用所述的单元调度器的处理过程,并传入上下文ID,包括以下步骤:
(A)所述的单元调度器从该上下文容器中获取到对应的上下文;
(B)所述的单元调度器从步骤(A)中获取到的上下文中获取下一个指令,作为当前指令;
(C)所述的单元调度器判断当前的指令的类型;
(D)如果该可执行请求是Perform类型,则所述的单元调度器运行自己的执行过程,包括以下步骤:
(aa)所述的单元调度器从节点注册器获取到适合于当前处理指令的节点行为实现对象,作为当前节点行为;
(bb)所述的单元调度器调用当前节点行为对象的执行前方法,触发对应的用户定制行为,并传入当前上下文;
(cc)所述的单元调度器调用当前节点行为对象的执行方法,触发用户定义的节点动作,并传入当前上下文;
(dd)所述的单元调度器调用当前节点行为对象的执行后行为,触发对应的用户定制行为,并传入当前上下文;
(ee)所述的单元调度器获取执行上下文的“是否继续”属性;
(ff)如果该属性为“不继续”,则直接退出,并返回步骤(45);
(gg)如果该属性为“继续”,则调用当前节点行为的获取后继方法,获取到后续节点;
(hh)循环为获取到的后续节点产生迁移类型的指令,并追加到当前上下文的执行队列当中;
(jj)所述的单元调度器记录当前可执行请求处理完成的日志;
(E)如果该可执行请求是Transmit类型,则所述的单元调度器执行自己的传送过程,包括以下步骤:
(aa)所述的单元调度器从节点注册器获取适合于当前处理指令的节点行为实现对象,作为当前节点行为;
(bb)所述的单元调度器通过调用当前节点行为对象的迁移前方法,触发对应的用户定制行为;
(cc)所述的单元调度器通过调用当前节点行为对象迁移传送动作,获取到后续节点列表,并判断是否能够获取到;
(dd)如果否,则当前节点是图中最后一个节点,也即结束节点,查找该节点的父节点,且该单元调度器为父节点产生一个新的指令,加入到当前上下文的执行队列当中,指定执行阶段为结束;
(ee)如果是,则当前节点是一个中间节点,所述的单元调度器顺次为后续节点创建新的指令,加入到当前上下文的执行队列当中;
(ff)所述的单元调度器记录当前指令处理完成的日志;
(iv)如果否,则对该外部请求的处理已经完成,并退出;
(v)重复上述步骤(ii);
所述的图形执行虚拟机停止操作,包括以下步骤:
(31)校验系统引擎的状态,对该系统引擎的停止过程进行加锁;
(32)所述的外观控制器调用该核心调度器的停止动作,包括以下步骤:
(a)所述的核心调度器给核心调度线程池发送中断信号,停止各线程工作;
(b)所述的核心调度器销毁该核心调度线程池对象;
(33)取消所述的节点行为注册器中各个已注册的节点行为;
(34)所述的外观控制器调用清空所述的上下文容器中当前的上下文;
(35)标记该系统引擎状态为已停止。
不仅如此,当所述的节点行为为分阶段节点行为时,所述的单元调度器运行自己的执行过程,包括以下步骤:
(51)所述的分阶段节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段信息;
(52)如果执行阶段是开始,则进行开始阶段操作处理,包括以下步骤:
(a)所述的分阶段节点行为设定指令上下文ExecutionContext的继续运行属性为真;
(b)所述的分阶段节点行为调用节点开始动作;
(c)所述的单元调度器判断是否继续;
(d)如果是,则设定下一个命令为执行,并继续回到开始的判断;如果否,则退出;
(53)如果执行阶段是指令,则进行指令阶段操作处理,包括以下步骤:
(a)所述的分阶段节点行为设定指令上下文ExecutionContext继续运行属性为真;
(b)所述的分阶段节点行为调用节点执行动作;
(c)所述的单元调度器判断是否继续;
(d)如果是,则设定下一个命令为结束,继续回到开始的判断;如果否,则退出;
(54)如果执行阶段是结束,则进行结束阶段操作处理,包括以下步骤:
(a)所述的分阶段节点行为设定指令上下文ExecutionContext继续运行属性为真;
(b)所述的分阶段节点行为调用节点完成动作;
(c)结束阶段处理完毕,退出执行。
同时,当所述的节点行为为块节点行为,所述的块节点行为的父类为分阶段节点行为,所述的单元调度器运行自己的执行过程,包括以下步骤:
(61)所述的块节点行为调用分阶段节点行为的上述步骤(51)至(54);
(62)所述的块节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段信息;
(63)如果该执行阶段信息不是执行,则直接退出;
(64)如果该执行阶段信息是执行,则所述的块节点行为获取已经设定的开始节点;
(65)所述的块节点行为对获取到的开始节点创建新的执行单元指令;
(66)所述的块节点行为把新创建的指令加入到当前执行上下文的执行队列当中,并完成。
在实际使用当中,本发明的图形执行虚拟机GEVM的总体包括启动、处理请求、停止三个主要过程。三个过程都以外观控制器为开始点,各过程分别描述如下:
过程一:GEVM启动过程如下:
(1)外观控制器检查引擎状态,并对引擎的启动过程进行加锁。
(2)外观控制器创建节点行为注册器,并调用节点注册器的初始化。
(3)外观控制器创建上下文容器。
(4)外观控制器创建单元调度器。
(5)外观控制器创建核心调度器,并调用核心调度器的初始化。
(6)解锁并标记GEVM启动完成,系统可接收外部请求。
所述的“外观控制器创建节点行为注册器,并调用节点注册器的初始化”包括以下步骤:
(1)外观控制器创建节点行为注册器对象。
(2)节点行为注册器创建节点行为缓存映射结构。
(3)节点行为注册器从配置文件获取各类型节点行为实现类,创建类的实例,并加载到缓存映射结构当中。
所述的“外观控制器创建核心调度器,并调用核心调度器的初始化”包括以下步骤:
(1)外观控制器创建核心调度器。
(2)核心调度器创建核心调度线程池。
(3)核心调度器从外观控制器获取并设置好对应的上下文容器。
(4)核心调度器启动应线程池,准备好接收外部请求。
过程二:GEVM处理请求过程如下:
(1)外观控制器从外部请求中获取IGraph参数、INode参数、处理阶段(Stage)参数,并组装成Execution对象。
(2)外观控制器调用核心调度器的process方法,对该请求进行处理。
所述的“外观控制器调用核心调度器的process方法,对该请求进行处理”包括以下步骤:
(1)核心调度器调用上下文容器的“创建”方法,创建请求上下文。
(2)核心调度器把上下文编号(ID)传递给线程池,线程池选择一个线程执行该请求。
所述的“核心调度器把上下文编号传递给线程池,线程池选择一个线程执行该请求”中,线程池中线程的处理过程如下(命名线程池中被选中的线程为“处理线程”):
(1)处理线程从上下文容器获取到对应的上下文,作为当前上下文。
(2)处理线程判断当前上下文是否还有更多的Execution。
(3)如果步骤(2)的判断结果是“有”,则处理如下:
(a)调用单元调度器的处理过程,传入上下文ID;
(4)如果步骤(2)的判断结果是“没有”,则表示对当前请求的处理已经完成,退出循环。
(5)处理线程循环进行(2)的判断。
所述的“调用单元调度器的处理过程,传入上下文ID”中,包括以下步骤(步骤序列A):
(1)单元调度器从上下文容器中获取到对应的上下文。
(2)单元调度器从(1)中获取到的上下文获取下一个Execution,作为当前Execution。
(3)单元调度器判断当前Execution类型,并根据类型走(4)或者(5)。
(4)如果步骤(3)判断结果是Perform类型,则处理如下:
(a)调度器执行自己的Perform过程;
(5)如果步骤(3)判断结果是Transmit类型,则处理如下:
(a)单元调度器执行自己的Transmit过程。
所述的“单元调度器执行自己的Perform过程”过程包括以下步骤(步骤序列B):
(1)单元调度器从节点注册器获取到适合于当前处理Execution的节点行为实现对象,作为当前节点行为。
(2)单元调度器调用当前节点行为对象的“执行前”方法,触发对应的用户定制行为,并传入当前上下文。
(3)单元调度器调用当前节点行为对象的“执行(Perform)”方法,触发用户定义的节点动作,并传入当前上下文。
(4)单元调度器调用当前节点行为对象的“执行后”行为,触发对应的用户定制行为,并传入当前上下文。
(5)单元调度器获取执行上下文的“是否继续”属性。
(6)如果步骤(5)的获取结果是“不继续”,则退出本过程序列,忽略后续步骤。
(7)如果步骤(5)的获取结果是“继续”,则调用当前节点行为的“获取后继”方法,获取到后续节点。并处理子过程:
(a)循环为获取到的后续节点产生迁移类型的指令(Execution),并追加到当前上下文的执行队列当中。
(8)单元调度器记录当前Execution处理完成的日志。
步骤序列A所述的“单元调度器执行自己的Transmit过程”,包括以下步骤:
(1)单元调度器从节点注册器获取适合于当前处理Execution的节点行为实现对象,作为当前节点行为。
(2)单元调度器通过调用当前节点行为对象的“迁移前”方法,触发对应的用户定制行为。
(3)单元调度器通过调用当前节点行为对象“迁移Transmit动作”,获取到后续节点列表。
(4)如果步骤(3)获取的结果为空,则说明当前节点是图中最后一个节点(结束节点),查找该节点的父节点,并执行以下子过程:
(a)单元调度器为父节点产生一个新的Execution,加入到当前上下文的执行队列当中,指定执行阶段为finish;
(5)如果步骤(3)获取的结果不为空,则说明当前节点是一个中间节点。执行如下子过程:
(a)单元调度器顺次为后续节点创建新的Execution,加入到当前上下文的执行队列当中;
(6)单元调度器记录当前Execution处理完成的日志。
下面将描述分阶段节点行为和块活动节点行为的Perform过程,针对这二者和前述过程的关系,说明如下:
根据前文原理中所述,用户是“通过实现节点行为接口”来实现对GEVM的扩展的。对于普通节点(比如BPM中调用自动服务的节点),用户直接实现节点行为接口即可,对于分阶段节点行为(比如,人工处理环节),用户可通过继承“分阶段节点行为”抽象类来更方便的进行实现;同样的,对于块活动节点,用户可继承“块活动节点行为”抽象类来更方便的实现。
所以,分段节点perform方法的处理过程、块活动节点的peform方法并非独立的过程,如果用户继承了对应的抽象基类来实现节点行为扩展,则在步骤序列B-3中就完成了这些过程。
分阶段节点行为是一种特殊的节点行为,重载了节点行为的perform方法,分段节点perform方法的处理过程如下:
(1)分阶段节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段。
(2)如果执行阶段是START,则:
(a)分阶段节点行为设定ExecutionContext继续运行属性为true。
(b)分阶段节点行为调用节点开始动作。
(c)判断是否继续,如果继续则设定下一个命令为EXECUTE,继续回到开始的判断,否则退出;
(3)如果执行阶段是EXECUTE,则
(a)分阶段节点行为设定ExecutionContext继续运行属性为true。
(b)分阶段节点行为调用节点执行动作。
(c)判断是否继续,如果继续则设定下一个命令为FINISH,继续回到开始的判断,否则退出;
(4)如果执行阶段为FINISH,则
(a)分阶段节点行为设定ExecutionContext继续运行属性为true。
(b)分阶段节点行为调用节点完成动作。
(c)Finish处理完毕,退出执行。
块活动行为节点是一种特殊的分阶段行为节点,其实现了器perform方法,块活动节点的Perform方法处过程如下:
(1)块节点行为调用父类(分阶段节点行为)实现的perform方法。
(2)块节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段。
(3)如果不是EXECUTE,则直接退出。
(4)如果是EXECUTE,则块节点行为获取已经设定的开始节点,并继续下面的操作。
(5)块节点行为对获取到的开始节点创建新的执行单元Execution。
(6)块节点行为把新创建的Execution加入到当前执行上下文的执行队列当中,完成。
过程三:GEVM停止过程如下:
(1)校验引擎状态,对引擎的停止过程进行加锁。
(2)外观控制器调用核心调度器的停止动作。
(3)取消节点行为注册器中各个已注册的节点行为。
(4)外观控制器调用清空上下文容器中当前的上下文。
(5)标记引擎状态为已停止。
所述的“外观控制器调用核心调度器的停止动作”包含以下步骤:
(1)核心调度器给线程池发送中断信号,停止各线程工作。
(2)核心调度器销毁线程池对象。
以下实施例总采用JDK 1.5为基础环境。
GEVM启动过程如下:
(1)外观控制器检查引擎状态,并对引擎的启动过程进行加锁。包括以下步骤:
(a)外观控制器判断引擎状态,如果状态为1,启动失败。
i.说明:引擎状态类型为整数,可选值包括:0:非活动状态1:活动状态
ii说明:对引擎加锁和修改引擎状态的操作下同,碰到不再详述
(b)对外观控制器中的lock对象实施synchronize操作。
(2)外观控制器创建节点行为注册器,并调用节点注册器的初始化。
(3)外观控制器创建上下文容器。
(4)外观控制器创建单元调度器。
(5)外观控制器创建核心调度器,并调用核心调度器的初始化。
(6)解锁并标记GEVM启动完成,系统可接收外部请求。包括以下步骤:
(a)修改引擎状态为1
(b)退出synchronize锁定状态
所述的“外观控制器创建节点行为注册器,并调用节点注册器的初始化”包括以下步骤:
(1)外观控制器创建节点行为注册器对象。
(2)节点行为注册器创建节点行为缓存映射结构。
(3)节点行为注册器从配置文件获取各类型节点行为实现类,创建类的实例,并加载到缓存映射结构当中。包括以下步骤:
(a)从当前目录获取GEVM-plugins.xml,从中获取所有的插件行为类,并分别创建实例
(b)把创建的节点行为插件实例增加到节点行为注册表中
i.说明:节点行为插件配置文件GEVM-plugins.xml文件结构如下为:
<?xml version=″1.0″encoding=″utf-8″?>
<root>
<behavior
nodeType=″manual″>gevm.nodebehavior.ManualTaskBehavior</behavior>
<behavior
nodeType=″service″>gevm.nodeBehavior.ServiceTaskBehavior</behavior>
......
</root>
(c)分别调用每个节点行为插件的start方法
所述的“外观控制器创建核心调度器,并调用核心调度器的初始化”包括以下步骤:
(1)外观控制器创建核心调度器。
(2)核心调度器创建核心调度线程池。
(a)线程池使用JDK1.5中java.util.concurrent.ThreadPoolExecutor。采用如下构造函数构造:
public ThreadPoolExecutor(int corePoolSize,//线程数
int maximumPoolSize,//最小线程数
long keepAliveTime,//线程保持活跃时间
TimeUnit unit,//时间的单元
BlockingQueue<Runnable>workQueue)//消息队列
(3)核心调度器从外观控制器获取并设置好对应的上下文容器。
(4)核心调度器启动应线程池,准备好接收外部请求。
GEVM处理外部请求的过程如下:
(1)外观控制器从外部请求中获取IGraph参数、INode参数、处理阶段(Stage)参数,并组装成Execution对象。
(2)外观控制器调用核心调度器的process方法,对该请求进行处理。
所述的“外观控制器调用核心调度器的process方法,对该请求进行处理”包括以下步骤:
(1)核心调度器调用上下文容器的“创建”方法,创建请求上下文。包括以下步骤:
(a)上下文容器创建一个新的执行上下文ExecutionContext,并初始化其执行队列ExecutionQueue为空队列。
(b)ExecutionQueue的当前Excution指针指向空(null)。
(c)上下文容器把当前Execution放入该ExecutionContext的执行上队列当中,作为该队列的第一个Execution。
(d)ExecutionQueue的当前Excution指针指向新加入的Execution。
(e)上下文容器产生一个新的上下文ID,把以此ID为key,把新创建的ExecutionContext放入容器当中。
备注:上下文容器的Mapping结构采用JDK1.5的java.util.concurrent.ConcurrentHashMap类。
(2)核心调度器把上下文编号(ID)传递给线程池,线程池选择一个线程执行该请求。
说明:调用的方法为ThreadPoolExecutor类的“public void execute(Runnable command)”方法。
所述的“核心调度器把上下文编号传递给线程池,线程池选择一个线程执行该请求”中,线程池中线程的处理过程如下(命名线程池中被选中的线程为“处理线程”):
(1)处理线程从上下文容器获取到对应的上下文,作为当前上下文。
(2)处理线程判断当前上下文是否还有更多的Execution
(3)如果步骤(2)的判断结果是“有”,则处理如下:
(a)调用单元调度器的处理过程,传入上下文ID。
(4)如果步骤(2)的判断结果是“没有”,则表示对当前请求的处理已经完成,退出循环。
(5)处理线程继续进行(2)的判断。
所述的“调用单元调度器的处理过程,传入上下文ID”中,包括以下步骤(步骤序列A):
(1)单元调度器从上下文容器中获取到对应的上下文。
(2)单元调度器从(1)中获取到的上下文获取下一个Execution,作为当前Execution。
(3)单元调度器判断当前Execution类型,并根据类型走(4)或者(5)。
(4)如果步骤(3)判断结果是Perform类型,则处理如下:
(a)单元调度器执行自己的Perform过程。
(5)如果步骤(3)判断结果是Transmit类型,则处理如下:
(a)单元调度器执行自己的Transmit过程。
所述的“单元调度器执行自己的Perform过程”过程包括以下步骤(步骤序列B):
(1)单元调度器从节点注册器获取到适合于当前处理Execution的节点行为实现对象,作为当前节点行为。包括以下步骤:
(a)单元调度器获取当前的Execution
i.获取当前Execution的方式为ctx.getCurrentExecution(),其中ctx外方法调用传入的参数。
(b)单元调度器从当前的Execution,进而获取到当前节点(INode)的类型。
(c)单元调度器从节点注册表(nodeRegistry)当中获取到对应的节点行为对象。(如果获取到空,该调度异常结束)
(2)单元调度器调用当前节点行为对象的“执行前”方法,触发对应的用户定制行为,并传入当前上下文。包括如下步骤:
(a)调用监听器的onBeforePerform方法,触发“行为将要发生”的信号。
(b)从上下文(ExecutionContext)中判断是否继续,如果不继续,则退出。
(3)单元调度器调用当前节点行为对象的“执行(Perform)”方法,触发用户定义的节点动作,并传入当前上下文。
(4)单元调度器调用当前节点行为对象的“执行后”行为,触发对应的用户定制行为,并传入当前上下文。
(5)单元调度器获取执行上下文的“是否继续”属性。
(6)如果步骤(5)的获取结果是“不继续”,则退出本过程序列,忽略后续步骤。
(7)如果步骤(5)的获取结果是“继续”,则调用当前节点行为的“获取后继”方法,获取到后续节点。并处理子过程
(a)循环为获取到的后续节点产生迁移类型的指令(Execution),并追加到当前上下文的执行队列当中。
(8)单元调度器记录当前Execution处理完成的日志。
以上“单元调度器执行自己的Perform过程”,示例代码如下:
public void perform(ExecutionContext ctx){
//步骤1:单元调度器获取到适合于当前处理Execution的节点处理器
Execution param=ctx.getCurrentExecution();
INode nd=param.getCurrentNode();
String nt=nd.getNodeType();
INodeBehavior nodeBehavior =nodeBehaviorRegistry.getNodeBehavior(nt);
if(nodeBehavior==null)
throw new RuntimeException(″Can′t find the node behavior:″+nt);
//步骤2:触发其注册的节点行为监听器的″执行前″行为通知节点行为监听器
listener.onBeforePerform(ctx);
if(!ctx.isContinue())
return;
//步骤3:单元调度器调用该节点行为对象的执行(Perform)行为
nodeBehavior.perform(ctx);
//步骤4:单元调度器通过触发其注册的节点行为监听器的″执行后″行为通知
listener.onAfterPerform(ctx);
//步骤5:单元调度器获取执行上下文的是否继续属性
if(!ctx.isContinue())
//步骤6:不继续则返回
return;
else {
//步骤7:针对当前运行的环节产生迁移类型的指令(Execution),并加入到执行队列当中
ctx.getExecutionQueue().insertExecution(
ExecutionFactory.createExecution(ExecutionType.TRANSIMIT,
param.getCurrentGraph(),param
.getCurrentNode(),...);
}
//步骤8:记录日志
EngineInstanceLogger.1og(ctx);
}
步骤序列A所述的“单元调度器执行自己的Transmit过程”,包括以下步骤:
(1)单元调度器从节点注册器获取适合于当前处理Execution的节点行为实现对象,作为当前节点行为。
(2)单元调度器通过调用当前节点行为对象的“迁移前”方法,触发对应的用户定制行为。
(3)单元调度器通过调用当前节点行为对象“迁移Transmit动作”,获取到后续节点列表。
(4)如果步骤(3)获取的结果为空,则说明当前节点是图中最后一个节点(结束节点),查找该节点的父节点,并执行以下子过程:
(a)单元调度器为父节点产生一个新的Execution,加入到当前上下文的执行队列当中,指定执行阶段为finish。
(5)如果步骤(3)获取的结果不为空,则说明当前节点是一个中间节点。执行如下子过程:
(a)单元调度器顺次为后续节点创建新的Execution,加入到当前上下文的执行队列当中。
(6)单元调度器记录当前Execution处理完成的日志。
分阶段节点行为是一种特殊的节点行为,重载了节点行为的perform方法,分段节点perform方法的处理过程如下:
(1)分阶段节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段。
(2)如果执行阶段是START,则
(a)分阶段节点行为设定ExecutionContext继续运行属性为true。
(b)分阶段节点行为调用节点开始动作。
(c)判断是否继续,如果继续则设定下一个命令为EXECUTE,继续回到开始的判断,否则退出。
(3)如果执行阶段是EXECUTE,则
(a)分阶段节点行为设定ExecutionContext继续运行属性为true。
(b)分阶段节点行为调用节点执行动作。
(c)判断是否继续,如果继续则设定下一个命令为FINISH,继续回到开始的判断,否则退出;
(4)如果执行阶段为FINISH,则
(a)分阶段节点行为设定ExecutionContext继续运行属性为true。
(b)分阶段节点行为调用节点完成动作。
(c)Finish处理完毕,退出执行。
针对以上分阶段节点的perform方法,使用Java代码描述如下:
public void perform(IExecutionContext ctx){
//步骤1:分阶段节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段
PerformStage command =ctx.getCurrentExecution().getPerformStage();
while(command!=null){
switch(command){
case START://步骤2:对Start的处理
ctx.setContinue(true);
startNode(ctx);
if (ctx.isContinue()){
command=PerformStage.EXECUTE;
ctx.getCurrentExecution().
setPerformStage(PerformStage.EXECUTE);
{
else command=null;
break;
case EXECUTE://步骤3:对Execute的处理
ctx.setContinue(true);
executeNode(ctx);
if(ctx.isContinue()){
command=PerformStage.FINI SH;
ctx.getCurrentExecution().
setPerformStage(PerformStage.FINISH);
{
else command=null;
break;
case FINISH://步骤4:对FINISH的处理
ctx.setContinue(true);
finishNode(ctx);
command=null;
break;
}
}
块活动行为节点是一种特殊的分阶段行为节点,其实现了其perform方法,块活动节点的Perform方法处过程如下:
(1)块节点行为调用父类(分阶段节点行为)实现的perform方法。
(2)块节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段。
(3)如果不是EXECUTE,则直接退出。
(4)如果是EXECUTE,则块节点行为获取已经设定的开始节点,并继续下面的操作。
(5)块节点行为对获取到的开始节点创建新的执行单元Execution。
(6)块节点行为把新创建的Execution加入到当前执行上下文的执行队列当中,完成。
GEVM停止过程如下:
(1)校验引擎状态,对引擎的停止过程进行加锁。
(2)外观控制器调用核心调度器的停止动作。
(3)取消节点行为注册器中各个已注册的节点行为。
(4)外观控制器调用清空上下文容器中当前的上下文。
(5)标记引擎状态为已停止。
备注:引擎停止的状态标记为:0
所述的“外观控制器调用核心调度器的停止动作”包含以下步骤:
(1)核心调度器给线程池发送中断信号,停止各线程工作。
说明:调用线程池ThreadPoolExecutor类的shutdown方法。
(2)核心调度器销毁线程池对象。
说明:设置线程池对象为null。
采用了本发明所提出的流程执行的基础框架(GEVM),由于其技术特点,必然具备以下几方面的优势:
(1)提高软件重用度,节省工作量。
从软件技术上来说,抽象出了可供多种流程实现的基础调度公共机制,减少了流程引擎开发的工作量。
(2)降低模块耦合度,提高并行开发能力。
通过GEVM主动加载各种节点插件行为的方法,各种节点行为之间开发不存在任何必然依赖性,流程引擎的各个部分可以交给不同技能的人去实现,降低了流程引擎的实现门槛。
(3)提高流程引擎的扩展性。
基于GEVM可以以开发扩展“插件”的形式扩充引擎的能力;对于新增节点功能只需要实现一些新的扩展插件即可,提高了流程引擎的扩展性。
(4)提高流程引擎的稳定性和易维护性。
一般的功能的变更只局限在特定的节点插件当中,可有效避免少量变动引起整个流程引擎的不稳定,提高了流程引擎的稳定性和易维护性,降低维护成本。
采用了上述的实现支持多种流程运行的图形执行虚拟机系统及其方法,由于其中对基于图形的流程产品的引擎进行了抽象,提取出了图形调度机制,实现了图形执行虚拟机GEVM,该图形执行虚拟机GEVM可以提高流程产品的松耦合能力和可扩展能力,有助于快速开发出稳定可靠的流程引擎产品,从软件技术上抽象出了可供多种流程实现的基础调度公共机制,减少了流程引擎开发的工作量,提高了软件重用度,节省了工作量;同时通过GEVM主动加载各种节点插件行为的方法,各种节点行为之间开发不存在任何必然依赖性,流程引擎的各个部分可以交给不同技能的人去实现,降低了流程引擎的实现门槛,降低了模块耦合度,提高并行开发能力;而且基于GEVM可以以开发扩展“插件”的形式扩充引擎的能力;对于新增节点功能只需要实现一些新的扩展插件即可,提高了流程引擎的扩展性;不仅如此,一般的功能的变更只局限在特定的节点插件当中,有效避免了少量变动引起整个流程引擎的不稳定,提高了流程引擎的稳定性和易维护性,降低了维护成本,适用范围较为广泛。
在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。
Claims (17)
1.一种实现支持多种流程运行的图形执行虚拟机系统,其特征在于,所述的系统包括:
外观控制器,负责图形执行虚拟机的启动、加载和停止,并接收外部请求的响应,调用其他部件处理请求;
上下文容器,维护节点行为处理过程中可以访问的上下文,确保用户获取到当前的执行单元、以及当前的执行队列;
节点行为注册器,维护一个不同类型节点行为的注册表;
核心调度器,分别与所述的外观控制器和上下文容器相连接,对所述的外观控制器传递过来的每一个请求分配一个线程进行调度;
单元调度器,分别与所述的上下文容器、节点行为注册器、核心调度器相连接,接收所述的核心调度器的请求,进行一次执行,其中每一次执行,先从所述的节点行为注册器中获取对应的节点的行为实现类,再从所述的上下文容器中获取对应的上下文,并传入上下文调用节点行为的对应方法。
2.根据权利要求1所述的实现支持多种流程运行的图形执行虚拟机系统,其特征在于,所述的核心调度器包括:
核心调度线程池,用于容纳该核心调度器所分配的线程;
执行队列处理器,分别与所述的核心调度线程池和单元调度器相连接,对应一个线程的实现,从执行上下文获取执行队列,并依次处理该执行队列中的每一个执行单元,对于每一个执行单元,该执行队列处理器调用所述的单元调度器进行处理。
3.一种基于权利要求1所述的系统实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的方法包括图形执行虚拟机启动操作、图形执行虚拟机请求处理操作和图形执行虚拟机停止操作,所述的图形执行虚拟机启动操作,包括以下步骤:
(11)所述的外观控制器检查系统引擎的状态,并对系统引擎的启动过程进行加锁;
(12)所述的外观控制器创建节点行为注册器,并调用节点注册器的初始化;
(13)所述的外观控制器创建上下文容器;
(14)所述的外观控制器创建单元调度器;
(15)所述的外观控制器创建核心调度器,并调用核心调度器的初始化;
(16)解锁并标记该图形执行虚拟机启动完成,系统可接收外部请求;
所述的图形执行虚拟机请求处理操作,包括以下步骤:
(21)所述的外观控制器从外部请求中获取IGraph参数、INode参数、处理阶段参数,并组装成指令对象;
(22)所述的外观控制器调用该核心调度器对该外部请求进行处理;
所述的图形执行虚拟机停止操作,包括以下步骤:
(31)校验系统引擎的状态,对该系统引擎的停止过程进行加锁;
(32)所述的外观控制器调用该核心调度器的停止动作;
(33)取消所述的节点行为注册器中各个已注册的节点行为;
(34)所述的外观控制器调用清空所述的上下文容器中当前的上下文;
(35)标记该系统引擎状态为已停止。
4.根据权利要求3所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的外观控制器创建节点行为注册器并调用节点注册器的初始化,包括以下步骤:
(121)所述的外观控制器创建节点行为注册器对象;
(122)所述的节点行为注册器创建节点行为缓存映射结构;
(123)所述的节点行为注册器从配置文件获取各类型节点行为实现类,创建类的实例,并加载到缓存映射结构当中。
5.根据权利要求3所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的外观控制器创建核心调度器并调用核心调度器的初始化,包括以下步骤:
(151)所述的外观控制器创建所述的核心调度器;
(152)所述的核心调度器创建核心调度线程池;
(153)所述的核心调度器从该外观控制器获取并设置好对应的上下文容器;
(154)所述的核心调度器启动对应的核心调度线程池,准备好接收外部请求。
6.根据权利要求3所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的外观控制器调用该核心调度器对该外部请求进行处理,包括以下步骤:
(221)所述的核心调度器调用所述的上下文容器的创建方法,创建请求上下文;
(222)所述的核心调度器把上下文编号ID传递给核心调度线程池,所述的核心调度线程池选择一个线程执行该外部请求。
7.根据权利要求6所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的核心调度线程池中被选择的线程为处理线程,所述的线程的执行该外部请求,包括以下步骤:
(41)所述的处理线程从所述的上下文容器获取到对应的上下文,作为当前上下文;
(42)所述的处理线程判断当前上下文是否还有更多的指令;
(43)如果是,则调用所述的单元调度器的处理过程,并传入上下文ID;
(44)如果否,则对该外部请求的处理已经完成,并退出;
(45)重复上述步骤(42)。
8.根据权利要求7所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的调用单元调度器的处理过程并传入上下文ID,包括以下步骤:
(431)所述的单元调度器从该上下文容器中获取到对应的上下文;
(432)所述的单元调度器从步骤(431)中获取到的上下文中获取下一个指令,作为当前指令;
(433)所述的单元调度器判断当前的指令的类型;
(434)如果该可执行请求是Perform类型,则所述的单元调度器运行自己的执行过程;
(435)如果该可执行请求是Transmit类型,则所述的单元调度器执行自己的传送过程。
9.根据权利要求8所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的单元调度器运行自己的执行过程,包括以下步骤:
(4341)所述的单元调度器从节点注册器获取到适合于当前处理指令的节点行为实现对象,作为当前节点行为;
(4342)所述的单元调度器调用当前节点行为对象的执行前方法,触发对应的用户定制行为,并传入当前上下文;
(4343)所述的单元调度器调用当前节点行为对象的执行方法,触发用户定义的节点动作,并传入当前上下文;
(4344)所述的单元调度器调用当前节点行为对象的执行后行为,触发对应的用户定制行为,并传入当前上下文;
(4345)所述的单元调度器获取执行上下文的“是否继续”属性;
(4346)如果该属性为“不继续”,则直接退出,并返回步骤(45);
(4347)如果该属性为“继续”,则调用当前节点行为的获取后继方法,获取到后续节点;
(4348)所述的单元调度器记录当前可执行请求处理完成的日志。
10.根据权利要求9所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的步骤(4347)之后还包括以下处理步骤:
(a)循环为获取到的后续节点产生迁移类型的指令,并追加到当前上下文的执行队列当中。
11.根据权利要求8所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的单元调度器执行自己的传送过程,包括以下步骤:
(4351)所述的单元调度器从节点注册器获取适合于当前处理指令的节点行为实现对象,作为当前节点行为;
(4352)所述的单元调度器通过调用当前节点行为对象的迁移前方法,触发对应的用户定制行为;
(4353)所述的单元调度器通过调用当前节点行为对象迁移传送动作,获取到后续节点列表,并判断是否能够获取到;
(4354)如果否,则当前节点是图中最后一个节点,也即结束节点,查找该节点的父节点,且该单元调度器为父节点产生一个新的指令,加入到当前上下文的执行队列当中,指定执行阶段为结束;
(4355)如果是,则当前节点是一个中间节点,所述的单元调度器顺次为后续节点创建新的指令,加入到当前上下文的执行队列当中;
(4356)所述的单元调度器记录当前指令处理完成的日志。
12.根据权利要求8所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的节点行为为分阶段节点行为,所述的单元调度器运行自己的执行过程,包括以下步骤:
(51)所述的分阶段节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段信息;
(52)如果执行阶段是开始,则进行开始阶段操作处理;
(53)如果执行阶段是指令,则进行指令阶段操作处理;
(54)如果执行阶段是结束,则进行结束阶段操作处理。
13.根据权利要求12所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的进行开始阶段操作处理,包括以下步骤:
(521)所述的分阶段节点行为设定指令上下文ExecutionContext的继续运行属性为真;
(522)所述的分阶段节点行为调用节点开始动作;
(523)所述的单元调度器判断是否继续;
(524)如果是,则设定下一个命令为执行,并继续回到开始的判断;如果否,则退出。
14.根据权利要求12所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的进行指令阶段操作处理,包括以下步骤:
(531)所述的分阶段节点行为设定指令上下文ExecutionContext继续运行属性为真;
(532)所述的分阶段节点行为调用节点执行动作;
(533)所述的单元调度器判断是否继续;
(534)如果是,则设定下一个命令为结束,继续回到开始的判断;如果否,则退出。
15.根据权利要求12所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的结束阶段操作处理,包括以下步骤:
(541)所述的分阶段节点行为设定指令上下文ExecutionContext继续运行属性为真;
(542)所述的分阶段节点行为调用节点完成动作;
(543)结束阶段处理完毕,退出执行。
16.根据权利要求12所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的节点行为为块节点行为,所述的块节点行为的父类为分阶段节点行为,所述的单元调度器运行自己的执行过程,包括以下步骤:
(61)所述的块节点行为调用分阶段节点行为的步骤(51)至(54);
(62)所述的块节点行为从当前执行上下文中获取到当前执行单元,并获取到执行阶段信息;
(63)如果该执行阶段信息不是执行,则直接退出;
(64)如果该执行阶段信息是执行,则所述的块节点行为获取已经设定的开始节点;
(65)所述的块节点行为对获取到的开始节点创建新的执行单元指令;
(66)所述的块节点行为把新创建的指令加入到当前执行上下文的执行队列当中,并完成。
17.根据权利要求3所述的实现支持多种流程运行的图形执行虚拟机的方法,其特征在于,所述的外观控制器调用核心调度器的停止动作,包括以下步骤:
(321)所述的核心调度器给核心调度线程池发送中断信号,停止各线程工作;
(322)所述的核心调度器销毁该核心调度线程池对象。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010533222 CN101996091B (zh) | 2010-11-04 | 2010-11-04 | 实现支持多种流程运行的图形执行虚拟机系统及其方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010533222 CN101996091B (zh) | 2010-11-04 | 2010-11-04 | 实现支持多种流程运行的图形执行虚拟机系统及其方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101996091A true CN101996091A (zh) | 2011-03-30 |
CN101996091B CN101996091B (zh) | 2013-05-08 |
Family
ID=43786277
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201010533222 Active CN101996091B (zh) | 2010-11-04 | 2010-11-04 | 实现支持多种流程运行的图形执行虚拟机系统及其方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101996091B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102915250A (zh) * | 2012-09-17 | 2013-02-06 | 北京中电普华信息技术有限公司 | 基于图形虚拟机的流程虚拟机及流程实现方法 |
CN105786608A (zh) * | 2016-03-24 | 2016-07-20 | 深圳市华成峰实业有限公司 | 异地虚拟机去重迁移方法及系统 |
CN108574712A (zh) * | 2017-03-13 | 2018-09-25 | 阿里巴巴集团控股有限公司 | 一种容器服务集群的创建方法及装置 |
CN113542517A (zh) * | 2020-04-14 | 2021-10-22 | 佳能株式会社 | 图像形成装置及其控制方法和存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080232690A1 (en) * | 2007-03-23 | 2008-09-25 | Palo Alto Research Center Incorporated | Method and apparatus for creating and editing node-link diagrams in pen computing systems |
CN101277304A (zh) * | 2008-03-21 | 2008-10-01 | 北京航空航天大学 | 基于规则的Web服务运行环境管理系统及管理方法 |
-
2010
- 2010-11-04 CN CN 201010533222 patent/CN101996091B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080232690A1 (en) * | 2007-03-23 | 2008-09-25 | Palo Alto Research Center Incorporated | Method and apparatus for creating and editing node-link diagrams in pen computing systems |
CN101277304A (zh) * | 2008-03-21 | 2008-10-01 | 北京航空航天大学 | 基于规则的Web服务运行环境管理系统及管理方法 |
Non-Patent Citations (2)
Title |
---|
苏阳等: "J2EE工作流的交互性研究与实现", 《计算机技术与发展》 * |
荣洁: "《JBPM4的流程虚拟机》", 《程序员》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102915250A (zh) * | 2012-09-17 | 2013-02-06 | 北京中电普华信息技术有限公司 | 基于图形虚拟机的流程虚拟机及流程实现方法 |
CN105786608A (zh) * | 2016-03-24 | 2016-07-20 | 深圳市华成峰实业有限公司 | 异地虚拟机去重迁移方法及系统 |
CN108574712A (zh) * | 2017-03-13 | 2018-09-25 | 阿里巴巴集团控股有限公司 | 一种容器服务集群的创建方法及装置 |
CN108574712B (zh) * | 2017-03-13 | 2021-06-01 | 阿里巴巴集团控股有限公司 | 一种容器服务集群的创建方法及装置 |
CN113542517A (zh) * | 2020-04-14 | 2021-10-22 | 佳能株式会社 | 图像形成装置及其控制方法和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN101996091B (zh) | 2013-05-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5140067B2 (ja) | ワークフローにおいて継続をモデル化するフレームワーク | |
Hoheisel | User tools and languages for graph‐based Grid workflows | |
CN102520925B (zh) | Aadl2tasm模型转换方法 | |
MX2008011914A (es) | Modelo de ejecucion abstracto durante un meta-tiempo de funcionamiento basado en continuacion. | |
US20120185293A1 (en) | Workflow management system and method for implementing workflow definition tool | |
Slominski | Adapting BPEL to scientific workflows | |
CN101996091B (zh) | 实现支持多种流程运行的图形执行虚拟机系统及其方法 | |
Combi et al. | Flaws in the flow: The weakness of unstructured business process modeling languages dealing with data | |
Xu et al. | A cloud robotic application platform design based on the microservices architecture | |
Kolovos et al. | The epsilon pattern language | |
Du et al. | EasyHPS: A multilevel hybrid parallel system for dynamic programming | |
CN102214094B (zh) | 经由异步编程模型执行操作 | |
CN101582027B (zh) | 基于形式领域融合的计算模型 | |
Legat et al. | An orchestration engine for services-oriented field level automation software | |
Wagner et al. | The heuristiclab optimization environment | |
Käster et al. | Process-oriented modelling, creation, and interpretation of multi-agent systems | |
Vepsäläinen et al. | Tool support for the UML automation profile-for domain-specific software development in manufacturing | |
Bloom et al. | SatX10: A Scalable Plug&Play Parallel SAT Framework: (Tool Presentation) | |
Wang et al. | An agent-based autonomous component model for internetware | |
van Hee et al. | History-based joins: Semantics, soundness and implementation | |
Qiu et al. | Research on Real-Time Software Development Approach. | |
Gianni et al. | HLA-Transparent Distributed Simulation of Agent-based Systems | |
Yang | A framework for formalizing UML models with formal language rCOS | |
Lianghuan et al. | Expressing and composing actors for deterministic and scalable programming in cloud | |
CN102915250A (zh) | 基于图形虚拟机的流程虚拟机及流程实现方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C56 | Change in the name or address of the patentee |
Owner name: PRIMETON INFORMATION TECHNOLOGY CO., LTD. Free format text: FORMER NAME: PRIMETON TECHNOLOGIES LTD. |
|
CP01 | Change in the name or title of a patent holder |
Address after: 201203, Shanghai Zhangjiang hi tech park, Pudong New Area, No. 456 blue wave road, 4F Patentee after: PRIMETON INFORMATION TECHNOLOGY CO., LTD. Address before: 201203, Shanghai Zhangjiang hi tech park, Pudong New Area, No. 456 blue wave road, 4F Patentee before: Primeton Technologies Ltd. |