首页> 中国专利> 一种基于SCXML标准的状态机工作流引擎

一种基于SCXML标准的状态机工作流引擎

摘要

本发明涉及一种基于SCXML标准的状态机工作流引擎,包括流程解析器、任务分派器、实例管理器和多状态机事件转发器;其中流程解析器用于解析流程定义文件;任务分派器用于向相应的资源分派在流程定义文件中指定的任务;实例管理器用于管理所有的状态机工作流实例;多状态机事件转发器用于接收状态机工作流实例在运行过程中发送的事件,并通过查找源状态机工作流实例的状态机实例树将该事件传递至相应的状态机工作流实例。本发明所提供的工作流引擎不仅具有传统工作流引擎引擎的任务分派能力,而且具有转发事件的能力,提升了实例之间的异步性,使得它能够为复杂协作式流程提供运行时的支持。

著录项

  • 公开/公告号CN106528157A

    专利类型发明专利

  • 公开/公告日2017-03-22

    原文格式PDF

  • 申请/专利权人 中山大学;

    申请/专利号CN201611012097.3

  • 发明设计人 余阳;郑强;

    申请日2016-11-17

  • 分类号G06F9/44(20060101);

  • 代理机构44102 广州粤高专利商标代理有限公司;

  • 代理人林丽明

  • 地址 510275 广东省广州市海珠区新港西路135号

  • 入库时间 2023-06-19 01:48:18

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-07-16

    授权

    授权

  • 2017-04-19

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20161117

    实质审查的生效

  • 2017-03-22

    公开

    公开

说明书

技术领域

本发明涉及工作流和状态机领域,更具体地,涉及一种基于SCXML标准的状态机工作流引擎。

背景技术

工作流技术最早被应用在企业内部文档的传递,随着时代的发展,工作流技术在企业间的跨组织协作、电子商务、行政管理等方面得到了广泛的应用。近年来,互联网的蓬勃发展对如何使用工作流技术来解决具有一系列新特性的业务流程问题提出了新的考验。传统工作流引擎不支持网络社会中复杂的协作流程的执行。在此情况下,迫切需要一种能够支持复杂协作流程执行的工作流引擎。

有限状态机(FSM)广泛被用于数字电路设计、游戏开发、单片机开发,程序设计等相关领域,但是随着应用复杂性的提升,FSM也慢慢的暴露出了自身的缺点:一旦状态和转移数量增多,不可避免的会出现状态爆炸情况。为了解决这个问题,很多针对FSM的扩展方案被提出来,其中David Harel提的Statechart模型针对状态爆炸问题提出了层次、并发、通信等扩展,并且具有严格的形式化语义。因此,该模型被对象管理组织组织采纳成为统一建模语言中状态图的基本思想,同时也被万维网联盟接受成为了State Chart XML(SCXML)状态机规范。目前已知的状态机工作流引擎有,微软的WWF,OpenSymphony组织的OSWorkflow。这些引擎对子流程的支持程度不够,缺少流程实例之间信息的共享,导致其不能支持复杂协作式流程的执行。例如子流程的数目是动态确定的,子流程到达某一个状态的时候必须报告给父流程或者其他流程相应的信息,从而驱动父流程或者其他流程的执行等复杂协作式流程。SCXML丰富的表达能力和事件驱动的思想,为构建支持复杂协作式流程的工作流引擎提供了可能。

发明内容

本发明为解决以上现有技术的难题,通过扩展状态机的进入动作和转移动作而提供了一种基于SCXML标准的状态机工作流引擎。由于该引擎具备任务派发和事件转发能力,使得它能够为复杂协作式流程提供运行时的支持。

为实现以上发明目标,采用的技术方案是:

一种基于SCXML标准的状态机工作流引擎,包括流程解析器、任务分派器、实例管理器和多状态机事件转发器;

其中流程解析器用于解析流程定义文件;

任务分派器用于向相应的资源分派在流程定义文件中指定的任务;

实例管理器用于管理所有的状态机工作流实例;

多状态机事件转发器用于接收状态机工作流实例在运行过程中发送的事件,并通过查找源状态机工作流实例的状态机实例树将该事件传递至相应的状态机工作流实例。

优选地,所述流程定义文件中对任务的描述方式通过userTask节点定义,所述userTask节点表示如下:

<userTask name=" " assiginee="" role="" instancesExpr="" event="">

<form name="" src="">

</form>

</userTask>;

其中name表示任务的名字,assiginee指定了该任务的执行者,role表示只有拥有该角色的执行者才能执行该任务,instanceExpr表示任务的数量,event表示任务完成之后发送给接收任务的状态机工作流实例的事件名,form表示动态表单,form节点中name表示表单名字,src表示表单路径。

优选地,所述多状态机事件转发器使用源状态机工作流实例所在的状态机实例树来传递事件,该状态机实例树的构建过程涉及到stateMachine节点,所述stateMachine节点表示如下:

<stateMachine src="" instances="">

<param name="" value=""></param>

<param name="" value=""></param>

</stateMachine>;

stateMachine节点用来启动新的状态机工作流实例,其中,src表示需要启动的新的状态机工作流实例的流程定义文件的路径,instances表示需要启动的新的状态机工作流实例的数量,param表示传递给需要启动的新的状态机工作流实例的参数;

启动新的状态机工作流实例的过程伴随着构建状态机实例树的过程,如下:

在启动新的状态机工作流实例时,调用流程解析器的解析方法根据stateMachine节点描述的src属性去获取流程定义文件,使用其返回的流程定义新建一个对应的状态机工作流实例,然后启动该状态机工作流实例;最后将该状态机工作流实例对应的ID插入到当前状态机工作流实例的状态机实例树,并且将对应的ID和状态机工作流实例插入到实例管理器里面。

优选地,所述状态机工作流实例向多状态机事件转发器发送事件时,是通过send节点向多状态机事件转发器发送事件的,send节点的描述如下:

<send event="" type="" mode="" targetName="" targetState="">

<param name="" value=""></param>

</send>;

send节点中的type,targetName,targetState, mode属性共同决定了目标状态机工作流实例的位置,param节点指定了该事件的参数;其中,event表示事件的名字;type表示目标状态机工作流实例的类型;targetName表示目标状态机工作流实例的名字;targetState表示目标状态机工作流实例当前所处的状态;param节点中name表示参数的名字,param节点中的value表示参数的值,send节点中可以有多个param节点,mode表示该事件的传播模式,所述的传播模式包括:

广播:表示传递给当前状态机工作流实例的状态机实例树上的所有节点;

多播:包括toOffspring、toChild、toSibling、toAncestor;其中,toOffspring表示传递给当前状态机工作流实例的所有子孙节点,toChild表示传递给当前状态机工作流实例的所有孩子节点,toSibling表示传递给当前状态机工作流实例的所有兄弟节点,toAncestor表示传递给当前状态机工作流实例的所有祖先节点;

组播:表示传递给状态机实例树中指定的一组状态机工作流实例;

单播:包括toParent,toParent表示传递给当前状态机工作流实例的父亲节点;

状态机工作流实例之间的通信的具体实现过程如下:状态机工作流实例向多状态机事件转发器发送相应的事件,多状态机事件转发器接收事件后通过查找源状态机工作流实例所在的状态机实例树将该事件传递至相应的状态机工作流实例。

与现有技术相比,本发明的有益效果是:

本发明所提供的工作流引擎不仅具有传统工作流引擎的任务分派能力,而且具有转发事件的能力,提升了实例之间的异步性,使得它能够为复杂协作式流程提供运行时的支持。

附图说明

图1为状态机工作流引擎的逻辑结构示意图。

图2为任务分派的顺序图。

图3为创建实例的顺序图。

图4为事件转发的顺序图。

图5为状态机工作流实例生成树示例图。

具体实施方式

附图仅用于示例性说明,不能理解为对本专利的限制;

以下结合附图和实施例对本发明做进一步的阐述。

实施例1

本发明的主要发明方案是提供一种状态机工作流引擎。

如图1所示,本发明所提供的状态机工作流引擎是基于SCXML标准构造而成的,其包括流程解析器、任务分派器、实例管理器和多状态机事件转发器;

其中流程解析器用于解析流程定义文件;

任务分派器用于向相应的资源分派在流程定义文件中指定的任务;

实例管理器用于管理所有的状态机工作流实例;

多状态机事件转发器用于接收状态机工作流实例在运行过程中发送的事件,并通过查找源状态机工作流实例的状态机实例树将该事件传递至相应的状态机工作流实例。

上述方案中,所述流程定义文件中对任务的描述方式通过userTask节点定义,所述userTask节点表示如下:

<userTask name=" " assiginee="" role="" instancesExpr="" event="">

<form name="" src="">

</form>

</userTask>;

其中name表示任务的名字,assiginee指定了该任务的执行者,role表示只有拥有该角色的执行者才能执行该任务,instanceExpr表示任务的数量,event表示任务完成之后发送给接收任务的状态机工作流实例的事件名,form表示动态表单,form节点中name表示表单名字,src表示表单路径。

如果在SCXML标准的onEntry节点内有定义userTask子节点,那么此节点的定义会被流程解析器解析为一个任务,在进入对应状态的时候,任务分派器会将该任务分配给assiginee或者role所指定的资源去执行。当任务完成的时候,状态机工作流实例接收event属性指定的事件完成状态转移。

流程定义文件中的userTask节点被流程解析器解析成了一个UserTask对象。该UserTask对象的顺序图如图2所示,其中资源服务负责管理用户和角色信息,工作项服务负责管理工作项信息,数据库保存流程中的所有数据。首先UserTask对象发送一个异步消息给任务分派器,一方面UserTask对象所在的线程返回继续执行,另一方面任务分派器所在的线程根据任务数量在角色下面找到相同数量的执行者,然后给每一个执行者分配工作项。

上述方案中,所述多状态机事件转发器使用源状态机工作流实例所在的状态机实例树来传递事件,该状态机实例树的构建过程涉及到stateMachine节点,所述stateMachine节点表示如下:

<stateMachine src="" instances="">

<param name="" value=""></param>

<param name="" value=""></param>

</stateMachine>;

stateMachine节点主要用来启动新的状态机工作流实例,其中,src表示需要启动的新的状态机工作流实例的流程定义文件的路径,instances表示需要启动的新的状态机工作流实例的数量,param表示需要传递给新的状态机工作流实例的参数;

启动新的状态机工作流实例的过程伴随着构建状态机实例树的过程,如下:

在启动新的状态机工作流实例时,调用流程解析器的解析方法根据stateMachine节点描述的src属性去获取流程定义文件,使用其返回的流程定义新建一个对应的状态机工作流实例,然后启动该状态机工作流实例;最后将该状态机工作流实例对应的ID插入到当前状态机工作流实例的状态机实例树,并且将对应的ID和状态机工作流实例插入到实例管理器里面。

流程定义文件中的stateMachine节点被流程解析器解析成了一个StateMachine对象。该StateMachine对象的顺序图如图3所示,其中实例执行上下文保存了流程执行过程的上下文数据。首先从实例执行上下文中获取当前状态机工作流实例的状态机实例树。然后执行一个循环,一共执行stateMachine节点中instances属性值描述的次数,每一次循环都调用流程解析器的解析方法,该方法根据stateMachine节点描述的src属性去获取流程定义,使用其返回的流程定义对象新建一个对应的状态机工作流实例,然后启动该实例。最后将该实例对应的ID插入到状态机实例树,并且将对应的ID和实例对象对象插入到实例管理器里面。

为了方便回溯祖先节点,状态机实例树的存储结构采用左孩子右兄弟加父亲的表示方法。如图5所示的状态机实例树,树中a,b,c,d表示业务流程中涉及到的四种类型的状态机,a1_s1表示a类型的状态机工作流实例a1正处于s1状态,a1指向a2的箭头表示a1状态变化过程中生成了a2实例,a2是a1的子节点。a2指向b1的箭头表示a1状态运行中生成了实例b1,其生成时间晚于a2,b1是a2的兄弟节点。a2和b1向上指向a1的箭头表示a1是它们的父亲节点,同理可推至其他节点。

上述方案中,状态机工作流实例向多状态机事件转发器发送事件时,是通过发送send节点向多状态机事件转发器发送事件的,send节点的描述如下:

<send event="" type="" mode="" targetName="" targetState=""> <param name="" value=""></param> </send>;

send节点中的type,targetName,targetState, mode属性共同决定了目标状态机工作流实例的位置,param节点指定了该事件的参数。其中,event表示事件的名字;type表示目标状态机工作流实例的类型;targetName表示目标状态机工作流实例的名字;targetState表示目标状态机工作流实例当前所处的状态;param节点中name表示参数的名字,param节点中的value表示参数的值,send节点中可以有多个param节点,mode表示该事件的传播模式,所述的传播模式包括:

广播:表示传递给当前状态机工作流实例的状态机实例树上的所有节点;

多播:多播包括toOffspring、toChild、toSibling、toAncestor;其中,toOffspring表示传递给当前状态机工作流实例的所有子孙节点,toChild表示传递给当前状态机工作流实例的所有孩子节点,toSibling表示传递给当前状态机工作流实例的所有兄弟节点,toAncestor表示传递给当前状态机工作流实例的所有祖先节点。

组播:传递给状态机实例树中指定的一组中的状态机工作流实例;

单播:包括有toParent,toParent表示传递给当前状态机工作流实例的父亲节点;

状态机工作流实例之间的通信的具体实现过程如下:状态机工作流实例向多状态机事件转发器发送相应的事件,多状态机事件转发器接收事件后通过查找源状态机工作流实例所在的状态机实例树将该事件传递至相应的状态机工作流实例。

流程定义文件中的send节点被流程解析器解析成了一个Send对象。该Send对象的顺序图如图4所示。首先从实例执行上下文里面获取当前状态机工作流实例的状态机实例树,然后调用多状态机事件转发器的发送方法,多状态机事件转发器根据事件的传播模式、目标状态机工作流实例类型、目标状态机工作流实例名字、所处状态等信息从状态机实例树中获取满足条件的目标状态机工作流实例集合。最后使用一个循环将该事件发送给目标状态机工作流实例集合中的每一个目标状态机工作流实例。

显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号