当前位置:文档之家› 各种工作流模式的实现

各种工作流模式的实现

各种工作流模式的实现作者:非也QQ:20674450Email:nychen2000@目录1.概述 (3)2.Fire Workflow流程元素介绍 (3)1)Activity和Task: (3)2)Synchronizer、StartNode、EndNode (4)3)Transition (4)3.设计约束 (4)1)约束1 (4)2)约束2 (4)3)约束3 (5)4)约束4 (5)5)关于设计约束的说明 (5)4.顺序、分支、汇聚 (6)1)顺序分支汇聚其实是统一的 (6)2)顺序业务流程举例 (8)3)并行业务流程举例 (8)4)分支选择业务流程举例 (9)5)汇聚业务流程举例 (10)5.子流程 (11)1)流程设计 (11)2)流程模拟 (12)3)关于“Multi-Merge”的探讨 (13)6.“自由流”(Jump) (14)1)流程设计 (14)2)流程模拟 (14)3)相关API (17)7.循环(Loop) (18)1)流程设计、模拟 (18)2)相关API (18)8.略过(Skip) (18)1)流程设计 (18)2)流程模拟 (19)9.会签 (20)10.委派 (21)11.任务完成期限 (21)1)流程设计、模拟 (21)2)相关API (22)12.监听工作流事件 (22)1)TaskInstance事件监听器 (22)2)ProcessInstance事件监听器 (23)13.表单绑定 (24)14.流程元素属性详细说明 (25)1)所有流程元素通用属性 (25)2)WorkflowProcess的属性 (25)3)StartNode、Synchronizer、EndNode属性 (25)4)Activity属性 (25)5)Transition的属性 (26)6)Subflow Task的属性 (26)7)Tool Task的属性 (26)8)Form Task的属性 (26)1.概述本文最初始的标题是“21种工作流模式的实现”,但是我觉得21种工作流模式总结的并不科学,“21中工作流模式”只看到了业务现象,没有反应出业务的本质。

例如:“并行模式(Parallel Split)”、“单选(Exclusive Choice)”、“多选(Multi Choice)”没有实质区别,都是从流程的分支中选择若干个执行。

具体选择哪几个是由“转移条件”决定的,如果转移条件计算结果为true则执行,否则不执行。

因此并行模式只是分支选择模式的一个特例,即所有的转移条件计算结果都是true。

再例如:21中工作流模式中的“同步(Synchronization)”、“简单汇聚(Simple Merge)”也没有实质区别,在Fire Workflow中这都是“同步器”节点统一处理。

我甚至认为21中工作流模式存在一些谬误,我简单阐述我的看法,欢迎探讨。

例如:21种工作流模式对“简单汇聚(Simple Merge)”的解释是“流程中的某个节点,使得两个或者多个流程分支汇聚在一起”,之所以将这种汇聚称为“简单汇聚”,是“假设多个流程分支不并行执行,因此汇聚点不需要进行复杂的同步操作”。

这种强行的“假设”看似简化了问题,实际上非常不合理。

这种假设要求汇聚点“预知”多个分支中只有一个分支被执行,这种预知是很难实现的;或者限制多个分支中只允许一个被执行,这种后继节点限制前驱节点的行为是很荒谬的。

因此,本文将工作流模式按照我自己的理解重新组织。

本文档的所有示例流程都在example_workflow_process.rar中。

2.Fire Workflow流程元素介绍在使用Fire Workflow设计业务流程之前,非常有必要介绍一下Fire Workflow的工作流元素。

Fire workflow的元素分成三类:1)Activity和Task,2)Synchronizer、StartNode、EndNode,3)Transition1)Activity和Task:Acitivty在中文里一般称为“活动”,但是在我的文档里习惯称之为“环节”。

Task是任务,代表具体的业务逻辑,如录入一张表单、调用一段java代码或者调用另外一个流程(子流程Task)。

一个环节中可以有多个任务。

例如某个入职流程中有一个体检环节,体检环节包含了“检查视力”、“检查肝功能”、“检查心血管功能”等等多个任务。

在Fire workflow 中,体检环节建模如下:2)Synchronizer、StartNode、EndNodeSynchronizer是同步器。

此处的“同步”是一个更加广义的概念,他代表工作流子系统的计算逻辑。

开始节点(StartNode)和结束节点(EndNode)是同步器的特例,开始节点是没有输入“边”的同步器,结束节点是没有输出“边”的同步器。

3)Transition转移(Transition)在Fire workflow并不仅仅是一条连接线,他代表控制权在工作流子系统和业务子系统之间交换。

3.设计约束在本人看来,可以将整个系统分成业务子系统和工作流子系统。

Activity和Task代表业务子系统的计算逻辑;Synchronizer、StartNode、EndNode代表工作流子系统的计算逻辑;Transition代表控制权在业务子系统和工作流子系统之间转移。

有如下流程设计约束。

1)约束1每个Activity的前驱节点、后继节点必须是同步器。

即控制权从工作流子系统获得,业务执行完毕后控制权必须交还给工作流子系统。

2)约束2每个Activity只允许有一个输入Transition,一个输出Transition。

为什么呢?如果某个Activity有多个输入Transition,则说明此Acitivty需要执行“汇聚”逻辑,然而“汇聚”并不是Activity的职责,而是同步器的职责;同理,如果某个Activity 有多个输出Transition,则说明该Activity需要执行“分支”逻辑,这也不是Activity的职责。

3)约束3每个同步器的前驱节点和后继节点都必须是Activity。

即从业务子系统获得控制权后,进行汇聚和分支计算,然后把控制权再交给业务子系统。

在Fire Workflow中,顺序流程中的同步器与复杂逻辑中的同步器的算法是一致的,如下图,S1是S2的特列。

4)约束4一个流程有且只有一个开始节点,至少有一个结束节点。

5)关于设计约束的说明Fire Workflow是以Petri Net作为理论基础的,因此上述设计约束首先是Petri Net的要求。

但是Fire Workflow也力求不生搬硬套Petri Net;我通过学习研究,发现用Petri Net可以非常恰当地描述“控制权”在“业务子系统”和“工作流子系统”之间相互转换这样一个业务模型。

可以用Petri Net中的token来刻画“控制权”这个概念,用T来刻画“业务子系统”这个概念,用P来刻画“工作流子系统”这个概念。

因此,上述设计约束可以精确、严密地描述业务流程。

4.顺序、分支、汇聚1)顺序分支汇聚其实是统一的首先,Fire Workflow认为,“分支”和“汇聚”都是一种计算逻辑,这种计算逻辑应该由“工作流子系统”负责完成。

Fire Workflow用“同步器”节点在模型中表示这种计算逻辑。

如下图,同步器“S”是一个一般意义上的同步器。

上图中“S”首先对t1、t2、t3执行汇聚操作。

在Fire Workflow中,不管t1、t2、t3中哪个或者哪几个流程分支被执行,S都能正确地进行汇聚。

S汇聚完成后,根据转移条件的计算结果,启动t_a,t_b,t_c中的一个或者几个分支。

为什么说顺序、分支、汇聚是统一的呢?A)在上图中,如果“S”的前驱和后继都是唯一的,则形成一个特例,即顺序流程。

如下图。

B)如果上图中“S”的前驱是唯一的,后继有多个,则形成了“21中工作流模式”中的“并行模式(Parallel Split)”、“单选(Exclusive Choice)”、“多选(Multi Choice)”。

如下图C)如果上图中“S”的前驱有多个,后继仅有一个分支,则形成“汇聚”,如下图。

不仅顺序、分支、汇聚是统一的,同步器、开始节点、结束节点也是统一的,即开始节点和结束节点是同步器的特例。

如果同步器的前驱为0,则形成开始节点,如果同步器的后继节点为0,则形成结束节点。

在Fire Workflow中分别用和表示这两个节点。

2)顺序业务流程举例顺序模式的实现以及模拟请参阅《2_通过设计器和模拟器快速了解Fire Workflow》流程定义文件是MyFirstProcess.xml3)并行业务流程举例并行业务流程其实是分支选择的一个特例,即所有的转移条件计算结果为true。

在Fire workflow中如果Transition的转移条件EL表达是为空,则默认其结果为true。

业务举例:某商场送货流程。

仓库备货完成后流程分拆为两个并行的分支,一个分支通知送货员送货;另一个线程启动短信发送程序,预约客户在家等候收货。

如下图:相关的流程定义文件见:And Split.xml。

流程模拟通过模拟器可以模拟该流程,如下图。

可以看到,在“仓库备货”环节完成后,两个分支执行线程并行执行。

4)分支选择业务流程举例以典型的请假流程为例,如果请假天数小于等于2天,项目经理审批即可,否则需要部门经理审批。

该流程图如下。

在本流程中定义了一个名称为days的流程变量。

流程定义文件是:choice.xml流程模拟:启动流程,在工具栏上点击,设置流程变量days的值为3,如下图签收并完成“填写请假条”任务后,系统启动了“部门经理审批”环节,而没有启动“项目经理审批”环节,如下图:读者可以重新模拟该流程,将days的值设置为1看看结果如何。

5)汇聚业务流程举例在上述“并行业务业务流程举例”中,结束节点实际上进行了汇聚。

我们从模拟器可以看到,当“仓库备货”环节完成后,“手机短信发送程序”被自动执行,此时结束节点的颜色变成黄色,表示正在等待另一个分支完成。

当送货分支完成后,结束节点变成蓝色,整个流程实例执行完毕。

5.子流程1)流程设计在Fire Workflow看来,子流程是父流程的一个任务。

可以通过创建一个附带子流程任务的环节,也可以在已经存在的环节中增加子流程任务。

在本文提供的子流程实例如下图,在父流程和子流程中都定义了一个流程变量xyz,在下一节流程模拟中可以看到,父流程的流程变量的值传递给了子流程。

父流程图子流程图流程定义文件是:parent.xml,child.xml2)流程模拟首先在父流程的模拟器界面启动父流程,并点击设置流程变量xyz的值为100,如下图签收并通过Activity1.Task1后,系统弹出选择文件的对话框,定位到child.xml流程定义文件,然后确定。

相关主题