邹 晶 刘毅敏
(武汉科技大学信息科学与工程学院 湖北 武汉 430081)
工作流引擎(WorkFlow Engine)是计算机集成应用系统的一个重要组成部分,它在企业信息化办公领域已经被实践证明了能大大提高企业的业务管理水平,被广泛应用在业务流程较为复杂的办公流程(Office Automation)、电子商务、企业资源规划等领域。基于工作流引擎的设计平台是在企业信息化办公系统开发之上抽象出来的“信息化平台快速开发中间件”,基于模型或消息驱动,提供可视化界面工具定制工作流数据模型以及流程流转控制组件,实现中间件生成基础软件模块、支持可扩展的快速开发[1]。大多办公自动化系统的内核就是工作流引擎,引擎负责驱动业务流程运转、提供解释器来解释各个工作流节点的意义[2],实例并初始化工作流程,执行和操作正在运行的流程。它的功能大致都包含有定制模型工具、流程调度器、外部数据访问接口等。由于不同业务不同工作流程的差异性和复杂性,一个可扩展且松耦合的工作流引擎是十分必要的,本文以有限状态机建立流程模型以达到适应复杂业务的要求。
国内外大量相关人员对工作流引擎系统技术进行了研究和实现,并取得了较好的成果。至今很多公司和活跃的开源社区也推出了一系列工作流引擎,文献[3]提出了基于JBPM工作流引擎的实现,它设计一种TopBPM工作流引擎并应用在金融行业,降低了企业成本,缩短开发时间。文献[4]提出了一种基于petri网理论的工作流引擎,并提出了灵活可重用的网络信息系统的快速开发应用程序的模块化的系统模型(RADWIS)。类似的还有基于Activity的工作流引擎等。
上述工作流实现的缺点是对使用者的要求过高,学习成本较大,考虑到实际企业中操作人员的计算机水平,本文提出一种新型工作流引擎的实现机制,即基于有限状态机和消息驱动机制,采用Winform技术设计可视化界面,操作人员只需要进行相关跳转条件的设置即可定制工作流模型,然后采用AOP思想增强模型以适应多变的业务流程,实现松耦合和高扩展性。
工作流是对生产过程中某些固定步骤的活动而抽象出来的事物。它通过将日常业务流程划分成特定固定数量步骤、由特定角色的人员,按照定义好的规则来流转这些流程,从而提高办公效率[5]。工作流相关技术的诞生迅速得到了广泛的研究和应用。
由于业务流程在各行业的区别很大,工作流基本概念很难达成共识,所以工作流标准尚未统一,正处于制定阶段[6],目前还没有一个标准被大范围的采用,比较有代表性的规范有:XPDL、BPML、BPEL、OMG、WSCI等[7]。在这其中,WFMC提出的工作流管理参考模型有着广泛的研究和拓展应用,如图1所示。
图1 工作流管理参考模型
有限状态机(FSM:Finite State Machine)是表示有限多个状态以及在这些状态之间迁移和动作的数学模型。FSM可以被作为对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。在计算机科学中也有广泛的应用,例如:计算机网络中的TCP协议,在建立可靠传输的时候,就使用了有限状态机,有LISTEN、ESTABLISHED、WAIT、CLOSED等状态。
可以通过一个五元组表示FSM数学模型:M=(Q,q0,Σ,δ,F),其中Q为状态的非空有限集合。q∈Q,q为M的一个状态。q0∈Q,是M的开始状态(初始状态或者启动状态)。Σ代表输入字母表。输入字符串都是Σ上的字符串。δ为状态转移函数(转换函数或移动函数),δ:Q×ΣQ,对任意(q,a)∈Q×Σ,δ(q,a)=p表示:M在状态q读入字符a,将状态变成p,并将读头指向输入字符串的下一个字符。F是M的终止状态集合,若q∈F,则q称M的终止状态。
为了描述一个有限状态机的工作状况,可采用状态转换图[8]。状态转换图是一个有向图,如图2所示。图中每个节点表示一种状态,一条边(或弧)表示一个状态迁移关系。初始状态节点q0用没有起点的箭头指向它来表示。若q0状态的输入为a,则进入状态q1,其他状态转移同理。终止状节点q3是机器完成了它程序之后的状态,通常表示成双重圆圈。
图2 FSM状态转换图
工作流程是由具体业务多环节共同组成,每一个环节又都由多个不同步骤构成,过去对工作流建模的思想是基于序列化思想来进行的。这种建模方式具体关注的是业务执行过程和顺序,无法满足一些复杂多变的业务,如有分流、聚合、并行、跳转等特点的工作流程[9]。基于上述问题,本文提出基于有限状态机的思想建模,将建模重心从业务的过程转移到待处理的业务流程实体上,无论流程多复杂,只需为工作流程定义有限个状态[10],初始状态统一定为Start,同时定义业务实体在某个状态上可能接收到的输入,再限定状态之间跳转的条件,每次输入中包含了跳转条件就发生状态迁移,进入新的状态,直到到达终止状态End。图3是某石化企业的一个工作流程:每一个矩形代表一个状态,箭头代表跳转方向和条件。当条件1满足时,由ZzSubmit状态跳转到JwxAdvice状态;条件2和条件3进行了工作流的分流,满足条件2进入CbConfirm状态,满足条件3进行ConfirmDone状态 ,同时满足则可两个状态并行;满足条件4后进行聚合。
图3 工作流程示例
从上述具体实例普及到一般情况就是:无论流程多复杂都可以分为有限个步骤,把一个业务流程的每一个步骤当作有限状态机的某一个状态。一个状态在某一条件下迁移到另一个状态完成的动作就是流程的流转;当一个状态有多个输入的时候,流程肯定存在聚合,从不同状态能进入同一个状态;当一个状态有多个输出的时候,流程肯定存在分流或者并行,从当前状态在某一条件下迁移至不同状态。
借助上述的映射思想,为了使工作流模型更加饱满并且适应性更强,利用AOP(Aspect Oriented Programming)面向切面的编程思想(如图4所示),在状态迁移条件满足后发生状态跳转首先进入一个前置动作Beforeaction,执行完前置动作再进入本状态。状态信息包含相关输入参数设置,定时功能设置,权限认证设置和基本属性等,状态的执行动作为Currentaction,且在跳出本状态后进入后置动作Afteraction。通过对模型的进一步完善,使得工作流模型更加具有可扩展性和对复杂多变流程的适应能力。
图4 AOP思想映射
依据上述的工作流与有限状态机的映射思路,本文将工作流模型划分为事件、变量、流、权限等子模块和流程管理引擎。这些模块通过.NET平台的Winform技术,分别设计成可视化的操作控件,可由操作人员(无需专业知识)定制工作流模型,下面进行各模块介绍:
事件Event(流程节点)类。其属性包含了由有限状态机对工作流程映射之后的所有流程节点基本信息。节点还有对流程调度前后的业务动作执行方法。一个事件代表一个状态机的状态,一个完整流程是一个状态机。
变量Param(变量集合)类。其定义着每个工作流程的变量集合以及每个流程节点相关的变量。业务数据都保存在变量表中,通过解析方法可以读取并持久化到数据库中。变量表存储着状态机各状态相关的输入和输出数据。
流Flow(流程流转)类。这个类定义着流程流转的规则,当变量表接收到业务数据输入时,工作流引擎会根据Flow中定义的路由规则去实现状态转移。每个流中包含了状态机状态迁移的条件。
权限Authority(权限认证)类。这个类通过RABC(基于角色的访问控制Role-Based Access Control)模型提供了一套权限认证的方法,用于在获取用户待处理流程时筛选与用户相关流程。
流程管理引擎CWorkFlow(流程管理类)。这个类包含各个子模块的增删查改方法,如添加流程节点或变量、修改路由规则等,还包含了流程XML文档的解析和反解析方法。用户在可视化界面的相关操作通过此类相应进行对有限状态机工作流模型的修改。
通过OOP面向对象的思想设计的模型主要类及其关键属性和方法如表1所示。
表1模型中类的主要信息
基于上述的基于有限状态机和AOP建模思想,以及对工作流模型各模块的设计,在可视化界面中定制的工作流模型本文采用可扩展的标记语言XML对工作流到有限状态机映射结果进行描述,这种方式方便、直观且易扩展[11]。可直接存入数据库中,然后使用流程管理类中的相关API进行解析等操作。XML映射文档中共定义了work_flow、item、params等不同节点,其中关键节点的含义如表2所示。
表2 XML描述文档主要节点
下文为本模型依据表2所示的节点描述的工作流样例的XML文档片段:
车间名称″>
……
desc=″车间名称″>
……
……
本文采用产生式规则的方法来对XML模型中流程流转状态进行推理。一种典型的产生式规则表示方式的模型如下:
RULE <节点名>
IF <条件1> then <结论1>
IF <条件2> then <结论2>
……
IF <条件n> then <结论n>
END RULE
其中的条件即是XML模型中的路由规则,相关信息由可视化界面定制保存在Flow类中,由路由规则能确定有限状态机的下一个状态。条件可以由<、>、=等算术运算符或者AND、OR、NOT等逻辑运算符式子组成。
状态迁移模块的工作过程可由算法1表示:
算法1状态迁移
输入:节点变量集合: Node_items
输出: 下一个流程节点:NEXT_Node
1. Node_items input check;
2. UPDATE XML root node “params”;
3. ANALYSIS “Rules” From XML nodes;
4. foreach item in Rules
5. if item is True then
6. DO Beforeaction;
7. GET NEXT_Node And DO Currentaction;
8. DO Afteraction;
9. endif
11. end for
12. UPDATE DATABASE;
13. UPDATE XML NEXT_Node;
14. Return NEXT_Node;
流程的调度功能主要是由推理机来实现,当状态机接收输入后,推理机根据XML模型中的路由规则来推理出状态机的下一个状态。状态的业务逻辑使用URL方式保存,即Currentaction、Beforeaction、Afteraction,它可以是页面地址或者接口,如果改变只需修改模型中的这些值,实现工作流程模型和业务的松耦合。同时AOP的思想保证了高扩展性从而适应多变的工作流程。
如图5所示XML文档中存储了工作流的映射信息,其中包含了当前状态机数据迁移的条件,它是一个逻辑表达式,由状态机中的变量,逻辑符号和对应的值组成,类似SubmitDone=True。如算法1所示过程:当前节点的相关变量有更新的时候,先做输入检查,然后更新状态机中变量表中相关变量的值,然后解析逻辑表达式,根据产生式规则推理是否满足其中的某些跳转条件,满足则迁移至下一状态,不满足则保持当前状态。状态迁移前后执行基于AOP思想的Beforeaction和Afteraction业务事件,最后更新状态机的XML描述到数据库。
图5 状态转移
本文设计的工作流引擎工作在某石化企业已经得到应用。图6展示的是本课题为本文所述的工作流引擎设计开发的一个可视化模型定制工具整体效果图。
图6 模型定制工具界面
图7展示的为定制工具顶上一行的菜单栏,包括新建、打开,保存工作流模型文件等操作按钮和工作流模型中添加事件、流、变量和属性设置等操作控件,以及保存模型至数据库的相关操作。
图7 定制工具菜单栏
由前文所述的工作流到有限状态机的映射和OOP模块设计可以知道,把工作流的每一个步骤当成有限状态机的某一个状态,也就是一个Event流程节点。工作流的流转、分流、聚合、并行是通过状态机的迁移来完成的,也就是流程流转Flow,工作流程的业务数据都存入Param变量中。所以为了降低使用者的操作难度,在绘制模型的时候,使用者只需通过了解业务流程,把流程分解成若干步,并通过界面进行每个步骤的参数、属性和步骤跳转条件的设置。
下面展示了通过可视化界面进行模型设计的具体步骤,如图8-图10所示。首先新建工作流,然后通过点击新增事件、流、变量等操作按钮绘制工作流,在输入界面设置事件、流、变量等参数属性,对应状态机的各个状态数据、相关输入输出参数和状态迁移条件,无需专业知识即可保存模型,且可自动生成XML文档,完成工作流的建模映射,也可序列化到数据库。这样降低了对工作人员专业知识的要求,工作流引擎作为办公自动化的中间件,高扩展的设计使得业务变动带来的工作量大量减少。
图8 新建工作流模型
图9 绘制工作流模型
图10 参数设置
本文从应用出发,以适应多变的工作流程和复杂的业务逻辑和降低用户和开发人员工作流和使用难度为宗旨,设计并实现了如上的一个基于有限状态机建立工作流模型的工作流引擎。把工作流程的每一步骤当成一个状态,一个流程当作一个状态机,复杂业务也可以通过状态机分流、聚合、并行、跳转等操作来描述。模型节点中包含了流程基本信息、路由规则、变量集合等模块,并基于面向切面的编程思想提高流程节点的扩展性,增加BeforeAction、AfterAction等业务URL地址,工作流引擎完成了统一的流程调度和数据调度。如果从用户的角度来看,只需在C/S端的可视化定制工作进行业务定制,并在Web端界面进行工作数据输入,极大地降低了使用难度。如果从程序设计人员的角度来看,当业务逻辑发生改变时,工作量也会大幅减小,业务重新定制后大部分工作只是参数设置改动。本工作流引擎已在某石化企业获得了较好的应用效果,具有广阔的应用前景。