轻量级工作流及其在发电企业燃料管理中的应用
2020-03-22王钧召江学武何云峰于俊清
王钧召,江学武,何云峰,于俊清*
(1.广东粤电信息科技有限公司,广东 广州510630;2.华中科技大学计算机科学与技术学院,湖北 武汉430074)
0 引言
工作流技术越来越广泛地应用在企业信息系统中,大部分企业信息系统都选择采用成熟的商业或开源的工作流产品,也有不少企业在原有信息系统基础上进行二次开发,实现符合自身需求的工作流管理系统(WfMS,Workflow Management System)[1-3]。商业工作流产品,国外主要有IBM 公司的Lotus Domino Workflow 和WebSphere MQ Workflow,以及Oracle 公司的Oracle Workflow 等工作流产品[4]。国内目前比较流行的WfMS,主要有西安协同的SynchroFlow,上海东兰的DLFlo 和杭州信雅达的SunFlow 等[5]。国外的工作流产品并不适合用于管理具有中国特点的业务流程,因此大部分企业都采用国内厂商生产的工作流产品,维护和升级比较方便。目前使用较多的开源工作流产品,主要有jBPM(Java Business Process Management,jBPM)和Activiti。jBPM[6-7]提供了工作流引擎和应用扩展接口,可以根据不同需求进行功能扩展,能够方便地集成到已有的系统中。Activiti[8-9]的发起人是原jBPM 创 始 人Tom Baeyens,Activiti 是 在jBPM3 和jBPM4 的基础上发展而来的,其内部接口与核心API与原jBPM 有很多的相似之处。Activiti 与jBPM 相比较,增加了流程可视化与管理能力,并加强了与外部系统的集成能力。
功能完备的工作流产品除了支持基本的业务操作之外,还支持“撤销”,“委派”,“会签”以及“自由流”等复杂业务场景,实现比较复杂,如果要集成到原有的信息系统中,需要修改相关代码和配置相关文件,才能方便对接。但是,发电企业燃料管理中的很多业务流程只需要基本的“通过”和“退回”功能,如果采用成熟的商业或开源工作流产品,将造成成本较高、集成复杂和系统兼容性差等问题。
为了能够方便地集成到已有的信息系统解决简单的业务流程定制,设计了轻量级的工作流管理系统[10],并将系统应用到火力发电企业燃料信息系统的审批流程中,实际应用结果表明,该系统可以满足信息系统中对审批流程自动化流转的要求,能够保证审批流程的正确运行。
1 工作流管理系统
1.1 工作流管理系统总体架构
根据WfMC 给出的工作流管理系统参考模型[11],轻量级工作流管理系统的总体架构如图1所示。
图1 工作流管理系统总体架构图Fig.1 System architecture of WfMC
工作流管理系统主要由工作流定义工具和工作流引擎组成。其中,工作流定义工具以图形化的方式为用户提供抽象实际业务流程及描述流程的手段,同时生成工作流模型,这里的工作流模型是指可被计算机处理的形式化定义,是由组成工作流的各个活动以及活动之间的关联关系等信息组成的一个完整的数据结构,通常被保存在数据库中。工作流引擎将数据库中保存的工作流模型作为依据,驱动工作流实例的自动流转[12]。
1.2 工作流定义工具
根据WfMC 规范,工作流定义工具由3 部分组成:模型设计器、工作流模型和模型控制器。
模型设计器用于定义工作流模型,通过拖拽相关组件进行流程图的绘制,鼠标点击和键盘输入操作可以设置各个活动的可操作角色,用户做出的各种请求动作将由模型控制器响应。用户定义工作流模型之前,流程设计器先查询该工作流模型是否已存在,如存在则在原有模型的基础上进行更改。
工作流模型既可以保存为XML文件,也可以保存在数据库中,作为工作流实例自动流转的依据。轻量级工作流系统通过工作流表、节点表、节点间连线表、工作流实例执行情况表4个数据表保存每一个工作流模型各个节点的信息和节点间连线信息,以及工作流实例的运行情况。
模型控制器负责响应模型设计器的请求动作,主要功能包括:图形化界面中各个组件的增删改查,工作流模型与XML 文件的相互转换,数据库的存取,以及一些其他操作如清空、撤销等。模型控制器中还提供一个重要功能,就是工作流模型的合理性验证。对工作流模型的合理性验证分为语法验证、语义验证和结构验证[13]。由于语义验证由工作流模型设计人员负责验证,所以验证功能只提供语法验证和结构验证。
1.3 工作流引擎
工作流引擎需要对定义的工作流模型进行解析,让计算机能理解该模型的具体含义,驱动工作流实例按照该模型进行正确流转,它是工作流管理系统的核心组成部分[14]。对于每个工作流实例来说,各项任务能够按照工作流模型进行自动流转并且互不干扰,都是因为工作流引擎在后台进行控制。工作流引擎的工作流程如下:
1)用户启动某个工作流实例,该实例开始执行;
2)工作流引擎从数据库中读取对应的工作流模型;
3)当用户对某个节点操作完成,工作流引擎决定该实例的流转方向,即决定下一个操作节点以及该节点可操作的角色,一直持续到该实例流转结束。
工作流引擎以工作流模型作为依据,根据控制参与者的操作权限和工作流实例的执行情况控制实例的正确流转。
2 工作流模型结构验证算法
2.1 典型的结构性错误
定义的工作流模型是否合理直接决定了工作流实例能否正常执行,因此工作流模型的合理性验证至关重要。工作流模型的合理性验证分为语法验证、语义验证和结构验证[15]。语法验证提供初级的错误验证,主要验证是否有重名的节点,是否有孤立的节点,每个节点是否都存在输入状态和输出状态等。语义验证用于验证工作流的定义是否与实际业务流程的目标相同,由工作流模型设计人员负责。结构验证检查是否存在非法并发、死循环等错误,这里重点说明结构验证。
工作流模型存在唯一的开始节点和结束节点。工作流模型可以看作有向图,该有向图必须是连通图,不能存在多个连通子图。因此从开始节点进行遍历必须能遍历到所有的节点,否则存在节点不可达的错误。工作流模型中可能存在非法并发单元,主要表现为非法入口,非法出口和并发跳转等。工作流模型组成元素包含:开始节点、结束节点、流程节点以及节点间连线。各个元素的图形化表示如图2所示。
图2 工作流模型组成元素表示图Fig.2 The legend of Workflow engine
常见的结构性问题主要有以下几个方面:
1)节点不可达;指对于某一个节点,无法从开始节点找到一条路径到达该节点,如图3(a)所示。如果存在不可达的节点,那么该节点的存在是无意义的,因为在工作流实例的执行过程中,该节点永远不会得到执行。
2)非法并发单元:非法并发单元是指存在错误的并发单元,错误原因包括非法出口、非法入口和分支跳转。
非法出口,是指存在某条路径,可以从并发单元内的某个节点直接到达并发单元外的某个节点。如图3(b)所示,一个有非法出口的并发单元由并发单元内的流程节点B可以直接到达并发单元外的流程节点E。
非法入口,是指存在某条路径,可以从并发单元外的某个节点直接到达并发单元内的某个节点。如图3(c)所示,一个有非法入口的并发单元由并发单元外的流程节点A可以直接到达并发单元内的流程节点C。
分支跳转,是指存在某条路径,可以从某个分支直接到达同一个并发单元中的另一个分支。如图3(d)所示,一个分支间存在跳转的并发单元由并发开始节点A有两条完全不重合的路径可以到达并发单元内的流程节点C。
3)其他错误:其他可能出现的结构错误如图3(e)所示,一个并发单元的并发开始节点A 可以直接到达并发结束节点D;又如图3(f)所示,由流程节点A,B,C,D组成了一个环,工作流实例一旦进入该环中,将一直在流程节点A,B,C,D之间循环执行,系统产生死循环,导致工作流实例不能正常结束。
2.2 结构验证算法
工作流模型可以看做是一个有向图,利用深度优先搜索的思想,对该有向图进行遍历,能够检测出存在的结构性错误。结构验证算法基于矩阵模型和深度优先搜索,能够检测出典型的结构性错误。该算法的流程图如图4所示。
1)初始化变量。
初始化节点总数n,并规定开始节点的编号为0,结束节点的编号是n-1,其他节点编号按照层次遍历的顺序从1 开始逐一递增。初始化矩阵变量matrix[n,n],visit[n,max]和info[n,3]。其中:
matrix[n,n]表示工作流模型中的节点间关系。visit[i,j]表示节点i到j之间的边执行情况,0表示未执行,1表示已执行,工作流实例执行之前所有的边都是未执行的。info[i,0]表示节点i是否已遍历,0表示未遍历,1 表示已遍历;info[i,1]表示节点i 入边个数,info[i,2]表示节点i的出边个数。
2)验证节点可达性。
通过递归算法遍历节点,验证info[0...n-1,0]是否都是1,如果存在0的情况,假如info[i,0]为0,那么说明无法找到一条路径从开始节点到达节点i,即存在不可达节点;如果info[0...n-1,0]都是1,则验证通过。接下来验证第二部分,采用相同的算法,但是传入参数matrix 时,选择传入他的变形矩阵antiMatrix[n,n],其中:
验证从结束节点能否逆向到达所有节点,即验证对于每一个节点都能至少找到一条路径能到达结束节点。
图3 结构性错误实例Fig.3 Examples of structural errors
图4 结构验证算法流程图Fig.4 Flow chart of structure verification algorithm
3)验证是否存在非法的并发单元、死循环等错误。
并发单元的验证主要依据并发单元的并发入口和并发出口的一对一的关系,且并发入口先于并发出口出现。因此,如果发生以下情况,则说明存在非法并发单元:并发出口先于并发入口出现;并发入口对应多个并发出口,或并发出口存在多个并发入口;并发入口与并发出口直连。
为了达到上述验证目的,定义了一个递归函数,其伪代码如下:
Algorithm 1:结构性验证算法
Input:
id:当前遍历节点的编号,初始为0
matrix[n,n]:该有向图的邻接矩阵
info[n,3]:info[i,1]表示节点i 入边个数,info[i,2]表示节点i的出边个数
dict[key,val]:dict中保存了所有的并发单元入口,并发单元出口的键值对[key,val]
stack:保存并发单元入口
Output:
errorInfo:记录可能发生错误的节点编号
1:if(info[i][2]>1)then
2:curKey ←id//curKey表示当前并发单元入口
3:if(dict中不存在curKey)then
4:dict ←[curKey,-1]
5:curKey入栈stack
6:endif
7:endif
8:if(info[id][1]>1)then
9:curVal ←id//curVal表示当前并发单元出口
10:if(dict中存在curKey)then
11:if(dict[curKey]不存在对应的val)then
12:dict[curKey]←curVal
13:if(并发入口与并发出口直连)then
14:errorInfo ←curVal//出现错误
15:endif
16:curKey 从stack 出栈//表示当前并发单元入口已找到出口,配对完成
17:else if(dict[curKey]!=curVal)then
18:errorInfo ←curVal//当前并发单元入口,存在多个出口,出现错误
19:endif
20:else then
21:errorInfo ←curVal//当前并发单元出口,不存在入口,出现错误
22:endif
23:endif
24:for(与节点id存在联系的所有节点i)
25:if(节点id到节点i之间的边未遍历过)then
26:递归调用本算法,其中参数id传入i
27:endif
28:endfor
2.3 算法分析
根据文献[16]中的相关表述,表1 中对常见的工作流结构验证算法进行了比较。其中N/A表示无法从文献中获知。
表1 结构验证算法比较表Table1 Structure verification algorithm comparison table
由表1可知,相比其他算法,本算法可以验证节点不可达、非法并发以及死循环等常见的结构性错误,算法的时间复杂度不高,并且实现相对简单。
3 应用
3.1 燃料信息管理系统
火力发电企业燃料信息系统中,存在很多审批流程,审批流程中存在多个环节,这些环节的操作都是类似的,只是操作顺序或者操作角色不同。随着需求的变动,审批流程需要经常变更,系统开发人员需要针对流程的变更,更改原先的审批流程代码,给系统带来了不稳定性,也增加了开发人员的负担。因此针对这种情况,设计了工作流管理系统,该系统可以自动控制审批流程的自动流转,即使更改审批流程,也不需要系统开发人员更改代码,从而保证了系统的稳定性。
3.2 系统实现
管理员设计工作流的具体执行步骤,即定义工作流模型,定义结果将保存在数据库中,作为工作流实例自动流转的依据。模型设计器的工具栏中,提供了组件绘制功能,通过鼠标的点击和拖拽动作便可完成设计,工具栏中还提供了清空,撤销和与XML 文件相互转换等辅助功能。模型设计器界面如图5所示。
图5 模型设计器界面示意图Fig.5 Workflow engine designer interface
工作模型在保存之前,将进行合理性验证,如果通过验证则保存到数据库中,否则不予保存。如果审批流程需要变更,只需更改在模型设计器中做简单调整即可,不需要对系统代码进行更改,但是之前正在执行的工作流实例必须重新开始执行。
3.3 审批流程
由具有指定权限的用户“提交”审批,之后便启动了一个合同审批流程的实例,该实例按照已定义的工作流模型开始执行。对于系统中所有相关用户,都存在一个待处理审批流程页面,当某个工作流实例流转到该用户可处理的节点时,页面就会显示这个工作流实例,该用户就能对这个实例进行审批操作。在审批过程中,可以看到工作流的详细执行情况,如图6 所示,在已执行节点上可以显示该节点历史执行记录,页面右侧显示了该工作流实例的历史执行情况。
图6 某工作流实例执行情况界面Fig.6 Workflow instance execution interface
4 结语
企业中某些业务流程只需要基本的“通过”和“退回”功能,如果采用成熟的商业或开源工作流产品,将造成成本较高,集成复杂以及系统不兼容等问题,本文针对这类简单的业务流程设计和实现了轻量级的工作流管理系统可以有效解决该问题。由于设计的工作流管理系统在工作流模型定义,模型结构性验证方面存在一定的局限性,未来可以在模型设计器中,增加“或分支”功能,用于指示工作流中的并发单元是条件选择关系,还是并发执行关系。