流程模型分析(3)
——流程发散聚合模型
@L_502_6@
三、流程的运转模型
这里将是本文最为核心的地方了,什么是工作流,也将在其运转模型中体现。
任何事物都是循序渐进的,由简单到复杂。我们先来看看最为基本的集中运转模型
3.1 基本运转模型
串行(Sequence)
串行,是最为简单,也最为容易理解的模型。按照预定的任务列表(Task A,Task B,Task C),有序的执行,如下图(3-1)所示。
图(3-1)
自循环
自循环的模型,主要用于表示:同一个任务节点,重复的执行多次。
图(3-2)
如图中所显示。“模式2”比“模式1”多了一个鉴别节点(Discriminator Node)。这两种模式,在现实中应用的都较为广泛,其中“模式1”更多的偏向人为的选择,也就是说,在任务执行后,由人为的决定是否继续重复的执行这次任务;而“模式2”则更多的倾向于一个既定的规则,按照原有的规则,决定是否重复执行。
3.2 发散运转模型
并行(Parallel)
并行,就涉及到流程的分支概念。就是说在流程运行过程中,因为不同的条件或情况,或者处理的业务需要多部门(多任务)分开处理,而产生了流程分支。如下图所示
图(3-3)
流程在执行完任务A后,因为需要,产生了两个并发执行的分支(A——B和A——C)。这两个分支之间是对等的,也是并行执行的。
有关上面的流程图,可能在以后的一些文章/文档中,大家会看到下面类似的图形
图(3-4)
虽然比上图多了一个And选择器,但实际上,两图,表示的是同一个含义或模型。所以大家在应用或读书的时候,可以长个心眼哦,自己学会实质性的分析。
独占式选择(Exclusive Choice)
当一个任务处理完后,发现其后面可允许走多个分支流程,但只允许选择其中某一个分支运行。这个选择是人为决策的,预先没有设点选择的规则。
图(3-5)
鉴别式选择(Discriminator Choice)
这同前面的“独占式选择”很相似,唯一不同点,就是多了一个鉴别器(Discriminator)。当任务达到这个鉴别器的时候,鉴别器会根据当前流程所处的状态,对比预先设定的一些选择规则,自动判别接下来流程的流向,也就是自动根据条件,选择一个满足条件的分支运行。
图(3-6)
鉴别器模式(有的可能叫选择器等等名字,表达的意思基本相同),在现实应用中较为广泛。比如在订单申请流程中,设定一个依据数额判别流向的鉴别器,如果数额大于等于5000就走分支流程A,如果数额小于5000就走分支流程B。
抄送模型
抄送模型,本身不是一个标准的工作流运转模型,但是在现实应用中,比比皆是。
它表达的意思是(请参考下图),存在主流程(A——C),在一个任务(A)执行完毕后,会继续执行主流程上下一个预定任务(C),但是同时也会激活另一任务(B)(或另外的流程)的执行,但是任务B以及任务B的后续流程,不会对主流程运转造成影响。
请注意图中的 A——B流程沿线,用的是灰色虚线表示,而且任务B也同样采用灰色表示。
图(3-7)
来个举个电子办公系统中,经常遇到得例子说明一下:比如一个发文,在交司局会签的时候,可能会抄送一份给另外的司局备案,这个过程就或额外的激活一个不影响主会签流程的“抄送任务”,比如图中Task B。
发散模型
说到这里,大家可再回过头参看一下并行模型(3.2.1节)。发散和并行最大的区别就是,各个分支(branch)的流程状态(或流程数据):
在并行模型中,分支状态(A-B)与分支状态(A-C)是大多数情况下是不相等的。由任务A执行后的状态进行一定条件下的“拆分”,形成了两个分支(或多个分支)流程。这多个分支流程,在最终需要重新聚合成一个主流程,以确保流程信息的完整性(当然,实际运行中,可能存在因为超时等特定原因而最终抛弃某个子流程)。
而在发散模型中,分支状态(A-B)与分支状态(A-C)是绝对相等的。因发散而产生的多个分支流程,在最终未必聚合(可能因为种种原因,聚合的时候会抛弃一个和多个分支流程)。
这里面说到了“聚合”概念,在后续的介绍上,将加以详细叙述
图(3-8)
3.3 聚合运转模型
下面我们就将进入聚合模型的介绍。因为有了“发散”,在一个流程的后续运转中,才会出现“聚合”这个问题。所以在后续讨论聚合模型的时候,大多情况下都会结合上面的发散运转模型。
同步聚合(synchronize merge)
由必要说明一下,同步聚合,可不是“同时聚合”噢。
图(3-9)
简单聚合(Simple Merge)
虽然名为简单聚合,不过在现实应用中,其理解度和应用度,都基本上比上面的“同步聚合”要难。多分支在聚合的时候,采用类似于“先进先出”法则,哪一个分支先达到,则最先激活流程的运行。后续的分支则到此就会终止。
图(3-10)
多重聚合(Multiple Merge)
多重聚合,与上面的简单聚合有些相似。但是比起Simple Merge可就复杂多了。到目前为止,在现实中,我还没有碰到过这样的流程实施。
多分支在聚合的时候,采用类似于“先进先出”法则,但是不同于简单聚合的是,任何一个分支,在到达这个聚会点的时候,均会激活后续流程的运转。
这就涉及到一个问题了,如果一个后续流程实例刚刚被激活,又一个分支到达,那么这个分支是否激活后续流程实例呢?在不同的工作流引擎中(workflow enginner)中会有不同的解决方案,有的选择立即激活,有的选择等待延迟激活。就这一点来说,不是本文的讨论主题,有兴趣的朋友,可以在自己的引擎中实现不同的方式。
图(3-11)
鉴别式聚合(Discriminator Merge)
这个是较为容易理解的,显示应用中也常常碰到,但是在应用的实施难度较大,因为一般与其配合的都会存在一个“规则引擎”,来定义/处理聚合规则
图(3-12)
---------------------------
作者:胡长城 (银狐999 , james999)
Email:james-fly@vip.sina.com
原文链接:https://www.f2er.com/javaschema/288433.html