一、工作流概念
1.案例(case):工作流系统的基本目的就是处理案例,保险索赔、绩效考核、抵押申请等等都是案例。每一个案例都有一个唯一的标识,案例在出现和消失之间总是处于某个特定状态,这个状态有三个元素组成:
(1)案例相关的属性,指出特定条件下案例是否被执行或者忽略
(2)已经满足的条件,说明案例的进展。
(3)案例的内容,可能是文档、文件、档案或者数据库
2.任务(task),泛指一般的工作单元,而非具体案例活动的一次具体执行(这一般称为活动),为了区分这一点,引入了工作项(work item)和活动的概念(activity)。工作项是指将要被执行的实际工作块,而活动就是指工作项的执行。
3.过程(process):过程指出了哪些任务需要被执行,以什么顺序执行。可以将过程理解为具体案例的蓝图。过程定义了案例的生命周期,每个生命周期都有start和end。
4.路由(route):决定了那些任务被执行和以何种方式执行,包括顺序、并行、选择和循环四种形式的路由
5.启动(start):触发,工作项是有一个resource来启动的,触发的形式包括:
(1)资源驱动,比如某个员工
(2)外部事件,一个JMS消息
(3)时间信号,比如凌晨2点触发某任务等等。
显然,触发是由环境而非工作流系统负责的。
二。Petri网
Petri网是一种过程建模和分析工具,是1962年由Carl Adam Petri提出的,它有着坚实的数学基础,完全形式化的,可以将Petri网应用于工作流的建模和分析过程。
1.传统的Petri网:
Petri网有place(库所)和transition(变迁)组成
place用于容纳token,token用以表示具体的案例,通过transition的firing(实施)来表现过程的状态转变。理解几个概念:
(1)transition enabled(变迁的就绪):当且进当transition的每一个输入place都至少有一个token的时候,变迁就绪,可以实施。
(2)transition firing(变迁的实施):变迁的从每个输入place取走一个token,并往它的每个输出place增加一个token。
看一个Petri网进行过程建模的例子:
圆圈表示place;矩形表示transition;用黑点表示token,存在于place中,这里没有表示出来,我在网上随便找的一张图,不过这里也展示了And-split、And-join、Or-split和Or-join的四种任务以及四种形式路由(从上到下依次是:顺序、并行、选择和循环)的Petri网建模。
2.高级Petri网
传统Petri网有一些缺点,比如无法对某些活动进行有效的建模,容易变的庞大而难以理解,因此通过扩展,就可以对复杂情况用结构化、容易理解的方式建模。关注三种扩展:颜色扩展、时间扩展和层次扩展。
1.颜色扩展,为token引入颜色,用以区分同一place中的不同token,颜色其实代表了token(具体到某个案例)的属性,通过颜色扩展,我们可以为将要被消耗的token值设置了前置条件,那么变迁就绪的前提变化为:每个输入place都至少有一个token,并且满足前置条件。颜色扩展,也将产生的token与消耗的token进行了关联,产生token的值和数目将依赖于被消耗的token的值。
2.时间扩展,当需要对一个过程的预期性能进行判断时,引入了时间扩展,为token加入时间戳,只有当被消耗的token的时间戳早于当前时间,就绪的transition才可以firing,而产生的token的时间戳就等于firing的时间加上延时。通过引入时间扩展,我们将可以对类似十字路口红绿灯时间敏感的复杂过程进行建模。
3.层次扩展,过程是由一系列的place、transition、弧线和子过程组成的,为了反映这样的层次结构,适应复杂过程的建模,引入了层次扩展。
三、工作流概念到Petri网的映射
1.过程:过程是由条件和任务组成,映射到Petri网,place就是条件,而transition就是任务。条件和place都是被动元素,而任务和变迁都是主动元素。案例就是token,案例的属性通过颜色扩展来映射,token的值包含了案例的属性值。比如保险索赔案例的属性:赔额、索赔人、时间等等。
2.路由:四种路由的Petri网建模,上面的图片已经给出。简单分析下:
(1)顺序路由,对应图1,任务A和B是顺序执行的,任务B的输入是任务A的结果。通过在两个任务之间引入一个place来解决,中间的圆圈对应的place是任务B执行前的必须满足的条件,同时是任务A执行的结果。
(2)并行路由:对应图2,为了并行地执行任务B和C,引入了任务A,称为And-split,在A和B、C之间引入两个place,当A任务实施后,为两个输出place产生token,任务B和C就处于就绪状态可以实施。当B和C都实施之后,类似的实行And-join任务(任务D)合并两个任务。
(3)选择路由:图3对选择路由的建模并不正确,选择执行B或者C,那么在B和C之前引入两个新任务t11、t12和两个place(合并称为Or-split),在前一个place的token,要么实施t11,要么实施t12,假设实施t11,那么任务B将就绪,反之则任务C就绪。同样的可以建模Or-join。选择路由还根据选择的时刻划分为两类,具体不再展开。
(4)循环路由,图四的建模也不是很精确,循环也跟编程语言中的循环分为:repeate ...until...和while ...do...两种,前者至少执行一次,而后者可能不执行,
3.启动的映射:我们知道工作项是案例和准备执行的任务的组合,而活动是指一个工作项的实际执行,一旦工作项被实际执行,它就转换成活动。映射到Petri网,工作项就是就绪的变迁(enabled transition),而活动对应一个transition的firing。Petri网中的transition是“饥饿”的,一旦它们就绪,就会立刻执行,这样的变迁成为自动的。而工作流中的触发并非是自动的,它可能是资源驱动、外部信号驱动以及时间驱动的。为了建模触发,我们在变迁的上面添加符号来区分:向下的箭头表示资源驱动,信封表示外部信号驱动,而时钟表示时间驱动。
初步了解了Petri网,确实是对工作流甚至业务过程建模的良好工具,对于利用Petri网进行过程分析,还待进一步学习。