在上篇文章中,我们讲到了BPM的生命周期包括设计、建模、执行、监控和优化5个阶段,本篇我们以住建行业的预销售许可审批的主线流程对BPM的执行过程进行详细的解剖。
BPM中的流程包括可执行流程和不可执行流程,不可执行流程在企业中占据了非常重要的位置,它包括战略流程、规划流程和管理层面的流程,目前大多数的BPMS套件只是实现了对BPM中的可执行流程的支持,而未支持不可执行流程。有的厂商通过称为BPA(Business Process Analysis)的产品来支持BPM中的不可执行流程,相关内容可参考8.3.1.1节关于ARIS及Control-ES产品的介绍。这里先看可执行流程,讲解执行过程之前,我们先来分析流程的组成。从建模期的流程定义上讲,流程组成就是由多个活动节点(在BPMS中,此活动节点一般都可以继续向下分解为子流程)按照一定的模式组成的一个转移序列,具体的组成分析如下。
BPM的流程组成如图1所示。
图1 端到端的预售证许可审批业务流程示意图
图中虚线框内的是流程的图形化组成,可以看到,这是一个端到端的预售证许可审批业务流程。要运行这个流程,需要在流程属性(整个流程上)和环节属性上(每个环节上)挂接一些资源,并配置一些属性。这些属性有业务方面的,也有技术方面的。
此属性本质上属于业务属性,虽然被行业流程产品封装为流程属性了,但是在使用时还是由业务人员进行定义。
流程定义的组成实现
(1) 自定义流程定义规范
可以给Process专门定义一个属性集合,来存储收件资料名称。如下:
<process> <requiredDocs> <doc>名称</doc> <doc>名称</doc> </requiredDocs> <activities> <activity>…</activity> </activities> <trasitions> <transition>…</transition> </transitions> </process>
(2) BPMN 2.0规范中的实现
在BPMN 2.0规范中,提供了extensionDefinitions的扩展机制,可以利用此扩展机制来存储业务上需要与流程定义绑定的相关属性,例如本例中的收件名称。不过扩展了此属性后,此BPMN 2.0的流程就不再是通用的流程了。交换到其他符合BPMN 2.0规范的BPMS产品中去时,extensionDefinitions属性是不能交换的。这就是为什么我们多次说到,不要妄想遵循相同规范的产品可以互相兼容。如果真的兼容,那也肯定是个实验室产品,因为任何一个厂商都会以客户的需求为第一要素,必然会在规范的基础上加入很多规范所允许的扩展。
除了利用extensionDefinitions属性以外,也可以单独定义一个关系表,即流程定义模版名称与收件资料集合的关系表。这样也可实现收件名称列表与流程的绑定。
此属性属于技术属性,但是如果做得足够简单易用,可以由业务人员定义(例如,提供可选择的单列表,表单名称具备足够的业务含义,就可以由业务人员通过选择进行绑定)。
流程定义的组成实现
(1) 自己定义流程定义语言
<process> <form id=’’ url=’’ /> </process>
(2) BPMN 2.0规范中的实现
在BPMN 2.0规范中,表单属性是与UserTask类型的活动绑定的,在UserTask活动上,定义了一个rendering属性,用来绑定此活动所对应的渲染表单。
此属性属于业务属性,可以由业务人员进行定义。
流程定义的组成实现
(1) 自定义流程定义规范
<process> <duration>…</duration> </process>
(2) BPMN 2.0规范中的实现
BPMN 2.0规范中有一个timer事件,但是不要搞混了,timer事件是属于定时事件,即在某个时间点触发事件的动作。对于时间的属性,并没有给出显式的说明,但是对于Activity活动,BPMN 2.0规范定义了<extensionElements>属性,通过此属性,可以定义任务期限。
此属性是技术属性,因此梦想由业务人员去定义是完全不可能的。虽然一些SOA的厂商鼓吹SOA就是搭积木(服务就是底层的积木)。天哪!这世界什么时候变得这样简单了。
流程定义的组成实现
(1) 自定义流程定义规范
<process> <events> <event refAction=’’ /> </events> </process>
(2) BPMN 2.0中的实现
在BPMN 2.0规范中,定义了大量的事件,详见第7章及第9章。
此属性属于介于业务属性与技术属性之间。通过灵活配置,可以做到让业务人员来定义。
流程定义的组成实现
(1) 自定义流程定义规范
<process> <messages > <message type=’’ name=’’/> </messages> </process>
(2) BPMN 2.0中的实现
在BPMN 2.0规范中,定义了消息调解事件(Message Intermediate Event)可以支持发送消息或等待消息触发,详见第9章的内容。
数据变量:在讲述事件时,我们提到流程与业务的交互是实现流程支撑业务的关键。流程与业务的交互通过事件实现。事件是实现方式,真正交互的是什么呢?是数据。也就是说,一些业务数据需要与流程执行引擎进行交互(关于交互的数据分类,详见3.5节工作流数据模式一节)。因此这个数据交互就必须通过数据变量作为桥梁来实现。在BPM的业务流程产品或实现中,如果BPM用于企业异构系统的应用集成,此场景中交互的数据较多,因此这个数据变量一般会通过SDO封装数据来实现。
此属性是技术属性,必须由技术人员来定义。
流程定义的组成实现
(1) 自定义流程定义规范
<process> <variants> <variant name=’’ tye=’’ value=’’ /> </variants> </process>
(2) BPMN 2.0中的实现
在BPMN 2.0规范中,采用Data Object相关对象来实现对数据变量的支持,详见7.3.2.4节数据元素与数据关联。
活动定义的组成实现同流程。
此属性是属于业务属性,与组织结构中的实体(例如角色、岗位等)简单绑定时,可以由业务人员来定义。但是涉及比较复杂的参与者计算或参与模式时,则必须由技术人员定义。
流程定义的组成实现
(1) 自定义流程定义规范
<process> <activities> <activity/> <participants> <participant name=’’ type=’’ id=’’> </participants> </activity> </activities> </process>
(2) BPMN 2.0规范中的实现
在BPMN 2.0规范中,对于参与者,是按照流程的私有与公开特性定义泳道(池及道)来区分(见第7章7.3.1.1节);对于流程编制,在后端定义了ResourceRole、Performer等对象来支持参与者;对于流程会话,则定义了Participants等对象来实现参与者定义。
活动定义组成实现
(1) 自定义流程定义规范
<activity> <duration>…</duration> </activity>
(2) BPMN 2.0规范中的实现
在BPMN 2.0规范中,对于活动的时间属性并没有给出显式的说明,但是对于Activity活动,BPMN 2.0规范定义了<property>、<dataInputAssociation>、<dataOutputAssocation>等属性,它们都可做为任务期限的存储容器。
我们通过以上对可执行流程的组成分析发现,一个建模期的、由业务分析师通过BPMN流程设计器建模后的业务流程要成为可支撑业务的可执行流程,还需要定义很多的业务属性和技术属性。只有这些业务属性和技术属性全部定义完毕,业务流程才真正成为可执行的流程。
提示:在上文中,已经给出了BPMN 2.0规范中的实现,那么在BPEL及XPDL规范中是怎样实现的呢?在BPEL和XPDL中,有些属性规范本身已经定义,有些属性则没有定义,不过都提供了扩展机制,例如XPDL的<extendsAttribute>和bpelextensions。利用这些扩展机制,可以实现对本例中所有属性的支持。
上文分析了可执行流程的组成,由此可以给出流程执行的定义:流程的执行也就是对可执行流程的流程定义进行实例化的过程。业内曾有这样的说法:对于工作流,执行=任务分配;对于BPM,执行=服务调用。应该说,这样的说法在一定的程度上反映了工作流与BPM的主要特点及区别。在大多数BPM项目中,存在着一定数量的Task分配,因此我们对BPM执行的定义如下:
BPM执行=任务分配(参与人、消息、表单、收件、期限)+ 业务流转(活动转移) + 路由决策 + 服务调用(执行事件)
任务分配(参与人、表单、收件、期限)
流程是指挥家,是导演,是参谋长。它运筹帷幄,运用各种战略、战术、规则,有序地指挥企业中的人,按照不同的控制模式、资源模式、数据模式进行业务的驱动。在BPM的项目中,任务分配是不可缺少的部分,只是其数量相对于WFM项目要少一些,其整个过程如下。
(1) 流程第一个环节的参与人(本例中是房地产开发商的预售证申报人员)登录预售申报系统,并请求第一个申报数据的表单,预售申报系统从预售审批流程的第一个环节(预售证申报)的活动定义中读取绑定的业务表单(预售申报录入单和收件列表表单)并展示给预售申报人员。
(2) 预售申报人员在录入单上填写相关的申报数据,并保存;
(3) 预售申报人员切换到收件列表表单,进行收件扫描件的上传;
(4) 保存业务数据,办结并转出此任务。
业务流转(活动转移)
房地产开发商的申报人员提交申报请求后,流程执行引擎需要按照流程定义,将活动驱动到第二个环节“房号登记”,那么这个驱动是怎么实现的呢?目前主流的实现技术有以下三种。
基于有限状态机(FSM)的状态转移
这是国内大多数流程执行引擎所采用的机制。有限状态机(FSM)又称为有限状态自动机或简称状态机,是表示有限个状态以及这些状态之间的转移和动作等行为的数学模型。
状态存储过去的信息,就是说它反映从系统开始到现在时刻的输入变化。转移指示状态变更,且转移本身是通过用必须满足转移发生的条件来描述的。动作是在给定时刻要进行的活动的描述。有多种类型的动作:
有限状态机是一种算法思想,简单而言,它由一组状态、一个初始状态、输入和根据输入及现有状态转换为下一个状态的转换函数组成。GoF的23种设计模式里的State模式是一种面向对象的状态机思想,可以适应非常复杂的状态管理。
现在,有限状态机在硬件领域被用于电路设计,而在软件领域被普遍用于搜索引擎的分词、编译器实现、游戏开发和流程执行引擎的实现。它在游戏开发中,通常用来实现NPC控制;而在流程执行引擎实现中,通常用来实现对于流程实例、活动实例、转移实例、工作项实例的状态迁移。有限状态机有多种实现方式,在流程执行引擎中一般采用面向对象的方式,如图2所示。
图2 有限状态机逻辑图
可以看出,有限状态机的下一个状态和输出是输入和当前状态的函数,也就是说,输入和条件触发当前状态变迁为下一个状态,而下一个状态的实现会产生输出结果,如图3所示。
图3 流程执行引擎部分实例对象关系图
表1 给出了流程执行引擎中工作项的状态转移情况。
表1 流程执行引擎中工作项的状态转移
状态 条件 |
准备 |
初始化 |
待签 |
待办 |
拾取 |
终止 |
异常 |
挂起 |
委托 |
结束 |
定义加载为实例 |
1 |
|||||||||
初始化 |
2 |
|||||||||
分配任务 |
3 |
|||||||||
签收 |
4 |
|||||||||
竞签 |
5 |
|||||||||
终止 |
6 |
|||||||||
程序异常 |
7 |
|||||||||
挂起 |
8 |
|||||||||
有委托记录 |
9 |
|||||||||
提交任务 |
10 |
流程执行引擎中工作项状态转移图如图4所示。
图4 工作项状态转移图
表2以状态转移表的形式描述了流程执行引擎中单个工作项(任务实例)的有限的多个状态、这些状态之间的转移、转移条件及触发转移的事件(执行动作)。图6.14以状态转移图的形式描述了在流程执行引擎内部一个具有2个节点的串行流程的工作项(任务实例)的状态转移情况:
加载并初始化第一个活动节点的任务实例(“预售申报”)形成待签à签收第一个任务实例形成待办à结束第一个任务实例à初始化第二个任务实例(“房号登记”)形成待签à签收第二个任务实例形成待办à结束第二个任务实例à继续向下驱动,直至整个流程结束。
在这个过程中,状态转移都是通过外部动作触发的,例如签收动作(sign in)会触发待签状态(to sign in)到待办状态(to do)的变迁。
基于Petri网中的token变迁
Pertri网是面向并行系统建模的一种非常好的形式化模型。一方面,Petri网可以采用图形进行表示;另一方面,它又有严格的数学定义可以进行一系列系统属性分析。关于Pertri网,感兴趣的读者可以阅读清华王建民老师翻译的《>工作流管理——模型、方法和系统》。那本书就是围绕着Pertri网讲解的,是荷兰埃因霍恩科技大学的两位教授Wil van der Aalst和Kees van Hee所著。
基于pi演算(进程代数)
pi演算是一种进程代数,起源于20世纪80年代末,由图灵奖得主罗宾·米尔纳(Robin Milner)提出。它是一种描述和分析并发系统的演算模型,采用演算中的归约来表示由进程间相互作用形成的动态演化,因此非常适合于描述动态系统。
在2003年,时任BPMI.org联席主席的Howard Smith和另一位Peter Fingar写了一篇文章“Workflow is just a Pi process”[2],发表在BPTrends的网站上。荷兰埃因霍恩科技大学的Wil van der Aalst教授在2004年写了一篇“Why workflow is NOT just a Pi-process”[3]的文章对此进行反驳,之后他又写了一篇为“Pi calculus versus Petri nets: Let us eat “humble pie” rather than further inflate the “Pi hype” ”[4]的文章,分析了pi演算的局限,并提出了7个挑战,对pi演算进行了质疑。来自于德国波茨坦大学的Frank Puhlmann则写了另一篇文章“Why do we actually need the Pi-Calculus for Business Process Management?”[5],认为在BPM中是需要pi演算的。
其实以上都是学术派的口水之战,大多从理论上进行争论,对于我们这些搞技术的IT从业者,不必太理会或者稍加了解就可以了。
通过以上的分析,读者应该清楚了流程执行引擎是怎样驱动业务进行流转的。
在预售证许可申报流程的第二个环节“房号登记”之后,要根据申报的预售项目的性质,决定发起哪个子流程(物业用房缴交核查子流程、拆迁安置房核查子流程、经适房核查子流程),这个决策通过一个M选N(参见第10章10.3.2.2节)的自动路由分支节点实现。而关于路由决策节点的技术实现,我们已经在第2章的规则引擎一节中讲过。
业务流转到三个核查子流程的某一个时,例如“物业用房缴交核查子流程”,此时如果物业用房管理子系统是独立部署的异构系统,则在当前环节需要通过事件机制,调用物业用房管理子系统提供的数据接收服务,将申报数据(PreSaleApplyDataSDO)传递给它。这个数据接收服务可能会注册在企业服务总线上。因此通过ESB提供的服务接口,由流程执行引擎进行这个服务调用。
通过以上四个步骤的分析,读者应该对流程执行引擎的执行过程有了较清晰的认识,下面我们给出完整的执行过程示意图,如图5所示。
图5 预售许可证审批流程执行过程示意图