《2022年FireWorkflow__各种工作流模式的实现 .pdf》由会员分享,可在线阅读,更多相关《2022年FireWorkflow__各种工作流模式的实现 .pdf(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、各种工作流模式的实现作者:非也QQ:20674450Email:目录1.概述.32.Fire Workflow流程元素介绍.31)Activity和 Task:.32)Synchronizer、StartNode、EndNode.43)Transition.43.设计约束.41)约束 1.42)约束 2.43)约束 3.54)约束 4.55)关于设计约束的说明.54.顺序、分支、汇聚.61)顺序分支汇聚其实是统一的.62)顺序业务流程举例.83)并行业务流程举例.84)分支选择业务流程举例.95)汇聚业务流程举例.105.子流程.111)流程设计.112)流程模拟.123)关于“Multi-M
2、erge”的探讨.136.“自由流”(Jump).141)流程设计.142)流程模拟.143)相关 API.177.循环(Loop).181)流程设计、模拟.182)相关 API.188.略过(Skip).181)流程设计.182)流程模拟.199.会签.2010.委派.2111.任务完成期限.211)流程设计、模拟.212)相关 API.2212.监听工作流事件.22名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 27 页 -1)TaskInstance事件监听器.222)ProcessInstance事件监听器.2313.表单绑定.2414.流程元素属性详细说明.251)所有
3、流程元素通用属性.252)WorkflowProcess 的属性.253)StartNode、Synchronizer、EndNode 属性.254)Activity属性.255)Transition 的属性.266)Subflow Task的属性.267)Tool Task 的属性.268)Form Task的属性.26名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 27 页 -1.概述本文最初始的标题是“21 种工作流模式的实现”,但是我觉得21 种工作流模式总结的并不科学,“21 中工作流模式”只看到了业务现象,没有反应出业务的本质。例如:“并行模式(Parallel Sp
4、lit)”、“单选(Exclusive Choice)”、“多选(Multi Choice)”没有实质区别,都是从流程的分支中选择若干个执行。具体选择哪几个是由“转移条件”决定的,如果转移条件计算结果为true 则执行,否则不执行。因此并行模式只是分支选择模式的一个特例,即所有的转移条件计算结果都是true。再例如:21 中工作流模式中的“同步(Synchronization)”、“简单汇聚(Simple Merge)”也没有实质区别,在Fire Workflow 中这都是“同步器”节点统一处理。我甚至认为21 中工作流模式存在一些谬误,我简单阐述我的看法,欢迎探讨。例如:21 种工作流模式对
5、“简单汇聚(Simple Merge)”的解释是“流程中的某个节点,使得两个或者多个流程分支汇聚在一起”,之所以将这种汇聚称为“简单汇聚”,是“假设多个流程分支不并行执行,因此汇聚点不需要进行复杂的同步操作”。这种强行的“假设”看似简化了问题,实际上非常不合理。这种假设要求汇聚点“预知”多个分支中只有一个分支被执行,这种预知是很难实现的;或者限制多个分支中只允许一个被执行,这种后继节点限制前驱节点的行为是很荒谬的。因此,本文将工作流模式按照我自己的理解重新组织。本文档的所有示例流程都在example_workflow_process.rar 中。2.Fire Workflow流程元素介绍在使用
6、 Fire Workflow 设计业务流程之前,非常有必要介绍一下Fire Workflow 的工作流元素。Fire workflow的元素分成三类:1)Activity和 Task,2)Synchronizer、StartNode、EndNode,3)Transition1)Activity和 Task:Acitivty在中文里一般称为“活动”,但是在我的文档里习惯称之为“环节”。Task是任务,代表具体的业务逻辑,如录入一张表单、调用一段java 代码或者调用另外一个流程(子流程 Task)。一个环节中可以有多个任务。例如某个入职流程中有一个体检环节,体检环节包含了“检查视力”、“检查肝功
7、能”、“检查心血管功能”等等多个任务。在Fire workflow中,体检环节建模如下:名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 27 页 -2)Synchronizer、StartNode、EndNodeSynchronizer 是同步器。此处的“同步”是一个更加广义的概念,他代表工作流子系统的计算逻辑。开始节点(StartNode)和结束节点(EndNode)是同步器的特例,开始节点是没有输入“边”的同步器,结束节点是没有输出“边”的同步器。3)Transition转移(Transition)在 Fire workflow 并不仅仅是一条连接线,他代表控制权在工作流子系
8、统和业务子系统之间交换。3.设计约束在本人看来,可以将整个系统分成业务子系统和工作流子系统。Activity 和 Task代表业务子系统的计算逻辑;Synchronizer、StartNode、EndNode 代表工作流子系统的计算逻辑;Transition 代表控制权在业务子系统和工作流子系统之间转移。有如下流程设计约束。1)约束 1每个 Activity的前驱节点、后继节点必须是同步器。即控制权从工作流子系统获得,业务执行完毕后控制权必须交还给工作流子系统。2)约束 2每个 Activity只允许有一个输入Transition,一个输出Transition。为什么呢?如果某个Activit
9、y 有多个输入Transition,则说明此 Acitivty需要执行“汇聚”逻辑,然而“汇聚”并不是Activity的职责,而是同步器的职责;同理,如果某个Activity有多个输出Transition,则说明该Activity 需要执行“分支”逻辑,这也不是 Activity 的职责。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 27 页 -3)约束 3每个同步器的前驱节点和后继节点都必须是Activity。即从业务子系统获得控制权后,进行汇聚和分支计算,然后把控制权再交给业务子系统。在Fire Workflow 中,顺序流程中的同步器与复杂逻辑中的同步器的算法是一致的,如
10、下图,S1 是 S2 的特列。4)约束 4一个流程有且只有一个开始节点,至少有一个结束节点。5)关于设计约束的说明Fire Workflow 是以 Petri Net 作为理论基础的,因此上述设计约束首先是 Petri Net 的要求。但是 Fire Workflow也力求不生搬硬套Petri Net;我通过学习研究,发现用Petri Net 可以非常恰当地描述“控制权”在“业务子系统”和“工作流子系统”之间相互转换这样一个业务模型。可以用Petri Net 中的 token 来刻画“控制权”这个概念,用T 来刻画“业务子系统”这个概念,用P 来刻画“工作流子系统”这个概念。因此,上述设计约束
11、可以精确、严密地描述业务流程。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 27 页 -4.顺序、分支、汇聚1)顺序分支汇聚其实是统一的首先,Fire Workflow 认为,“分支”和“汇聚”都是一种计算逻辑,这种计算逻辑应该由“工作流子系统”负责完成。Fire Workflow 用“同步器”节点在模型中表示这种计算逻辑。如下图,同步器“S”是一个一般意义上的同步器。上图中“S”首先对t1、t2、t3 执行汇聚操作。在Fire Workflow 中,不管t1、t2、t3中哪个或者哪几个流程分支被执行,S都能正确地进行汇聚。S 汇聚完成后,根据转移条件的计算结果,启动t_a,t
12、_b,t_c 中的一个或者几个分支。为什么说顺序、分支、汇聚是统一的呢?A)在上图中,如果“S”的前驱和后继都是唯一的,则形成一个特例,即顺序流程。如下图。B)如果上图中“S”的前驱是唯一的,后继有多个,则形成了“21 中工作流模式”中名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 27 页 -的“并行模式(Parallel Split)”、“单选(Exclusive Choice)”、“多选(Multi Choice)”。如下图C)如果上图中“S”的前驱有多个,后继仅有一个分支,则形成“汇聚”,如下图。不仅顺序、分支、汇聚是统一的,同步器、开始节点、结束节点也是统一的,即开始节
13、点和结束节点是同步器的特例。如果同步器的前驱为0,则形成开始节点,如果同步器的后继节点为 0,则形成结束节点。在Fire Workflow 中分别用和表示这两个节点。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 27 页 -2)顺序业务流程举例顺序模式的实现以及模拟请参阅2_通过设计器和模拟器快速了解Fire Workflow 流程定义文件是MyFirstProcess.xml3)并行业务流程举例并行业务流程其实是分支选择的一个特例,即所有的转移条件计算结果为true。在 Fireworkflow 中如果 Transition 的转移条件EL 表达是为空,则默认其结果为true
14、。业务举例:某商场送货流程。仓库备货完成后流程分拆为两个并行的分支,一个分支通知送货员送货;另一个线程启动短信发送程序,预约客户在家等候收货。如下图:相关的流程定义文件见:And Split.xml。流程模拟通过模拟器可以模拟该流程,如下图。可以看到,在“仓库备货”环节完成后,两个分支执行线程并行执行。名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 27 页 -4)分支选择业务流程举例以典型的请假流程为例,如果请假天数小于等于2 天,项目经理审批即可,否则需要部门经理审批。该流程图如下。在本流程中定义了一个名称为days 的流程变量。流程定义文件是:choice.xml流程模拟:
15、启动流程,在工具栏上点击,设置流程变量days 的值为 3,如下图名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 27 页 -签收并完成“填写请假条”任务后,系统启动了“部门经理审批”环节,而没有启动“项目经理审批”环节,如下图:读者可以重新模拟该流程,将days 的值设置为1 看看结果如何。5)汇聚业务流程举例在上述“并行业务业务流程举例”中,结束节点实际上进行了汇聚。我们从模拟器可以看到,当“仓库备货”环节完成后,“手机短信发送程序”被自动执行,此时结束节点的颜色变成黄色,表示正在等待另一个分支完成。当送货分支完成后,结束节点变成蓝色,整个流程实例执行完毕。名师资料总结-精品
16、资料欢迎下载-名师精心整理-第 10 页,共 27 页 -5.子流程1)流程设计在 Fire Workflow看来,子流程是父流程的一个任务。可以通过创建一个附带子流程任务的环节,也可以在已经存在的环节中增加子流程任务。在本文提供的子流程实例如下图,在父流程和子流程中都定义了一个流程变量xyz,在下一节流程模拟中可以看到,父流程的流程变量的值传递给了子流程。父流程图名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 27 页 -子流程图流程定义文件是:parent.xml,child.xml2)流程模拟首先在父流程的模拟器界面启动父流程,并点击设置流程变量xyz 的值为 100,如
17、下图签收并通过Activity1.Task1 后,系统弹出选择文件的对话框,定位到child.xml 流程定义文件,然后确定。系统启动Activity2.Task1,流程执行进程视图切换到child 流程,同时父流程的流程变量的值赋给了子流程。如下图。你可以通过工具栏右边的下拉列表在执行进程视图中切换不同的流程。名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 27 页 -签收并结束子流程,将视图切换当parent,可以看到父流程的Activity2.Task1也结束了,并且启动了父流程的Activity3.Task1。如下图3)关于关于“Multi-Merge”的探讨在“21
18、种”工作流模式中有一个种模式叫做“Multi-Merge”,其含义是在“汇聚点”后的环节可以被执行多次,如下图:在上图中如果流程分支t1 执行到汇聚点S 时,Activity3 和 Activity4会被执行一遍;同理当 t2 执行到汇聚点S时,Activity3和 Activity4也会被执行一遍。显然S只是图形上的汇聚,在运行时并未起到同步的作用。在这种情况下,用 Fire workflow 的子流程来建模可能更加合理。将 Activity3和 Activity4置于子流程中(假设子流程名称为MyChildProcess),父流程如下图。St1Activity1Activity2Activ
19、ity3Activity4t2名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 27 页 -6.“自由流”(Jump)1)流程设计“自由流”是一种中国特色的业务流程模式,即在某些特殊情况下,流程不按照既定顺序执行,在环节间自由跳转。在 Fire Workflow中,跳转操作还不能在设计器中通过图形表达,只能调用接口IWorkItem.jumpTo(StringnextActivityId,ListnextActorIds)完成。jumpTo 方法首先结束当前WorkItem、TaskInstance和 ActivityInstance,然后启动目标Activity,创建相应的Ta
20、skInstance 和 WorkItem。自由跳转是有条件的,其首要条件是当前环节和目标环节在同一个“执行线”上,如果Fire Workflow 检查到当前环节和目标环节不在同一个执行线上,则拒绝执行跳转操作。“执行线”是我创造的一个工作流名词,在图论中的定义是Li(activity1)=Li(activity2)。即:如果 activity1 的所有前驱节点和后继节点构成的集合等于activity2 的所有前驱节点和后继节点构成的集合,则称activity1 和 activity2 在同一个执行线上。如下图,Activity1和Activity2在同一个执行线上,Activity1和 Ac
21、tivity5 也在同一个执行线上;但是,Activity1和 Activity3不在同一个执行线上,Activity3和 Activity4也不在同一个执行线上。流 程 进 行 跳 转 的 第 二 个 条 件 是 当 前 环 WorkItem 的 结 束 操 作 可 以 触 发 对 应 的TaskInstance 和 ActivityInstance 也正确结束,否则Fire workflow 拒绝进行跳转操作。例如,在会签的情况下,如果还有操作员没有完成他的工单,则不能执行跳转操作,只有最后一个完成工单的操作员才具备执行跳转操作的条件。自由流相关的流程定义文件见:Jump.xml2)流程模
22、拟下面模拟从环节Activity1直接跳转到Activity5的情形。名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 27 页 -A)首先创建流程实例,并签收Activity1.Task1。得到的流程执行进程视图如下B)然后点击工具栏按钮,弹出对话框。在该对话框中输入目标环节的名称和操作员 ID,多个 ID 通过逗号分隔。在有多个 ID 的情况下,一般都需要签收,因此需要选中“NeedSign”复选框。如下图,有两个操作员,分别是“Zhangsan”和“Lisi”。确定对话框后,流程跳转到Activity5;同时从模拟数据视图中可以看到,系统生成了两个 WorkItem,分别赋
23、值给Zhangsan和 Lisi 如下图。名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 27 页 -C)签收 Activity5.Task1。在本例中,如果点击来签收 Activity5.Task1,系统会报告如下错误:Sign workitemfailed,NOtodoworkitemsforactoractorId=Fireflow_SimulatorandtasktaskId=JumpTo.Activity5.Task1。即,操作员 Fireflow_Simulator在 Activity5.Task1 上没有待办任务。必须点击“Sign as.”菜单来执行签收操作。如
24、下图点击“Sign as.”后,系统弹出对话框,要求输入操作员ID,此时输入Zhangsan(或者 Lisi)成功签收任务。如下图:签收任务后,在模拟数据视图中可以看到“Zhangsan”的工单变成了 Started状态,而 Lisi的工单被删除了。这是因为Acitivity5.Task1不是的任务分配策略是“ANY”,如下图;即任何一个操作员完成该任务即可,这种情况下,只要一个操作员签收了他的工单,其他的工单将被删除。名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 27 页 -D)完成 Activity5.Task1点击“Complete As.”,完成 Activity4.
25、Task1,如下图:3)相关 API名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 27 页 -7.循环(Loop)1)流程设计、模拟循环是“自由流”的特例,即跳转到已经被执行过的环节上。Fire Workflow 自动把工单分派给上一次完成该环节任务的操作者。在 Fire workflow中,循 环 也 不 能 在 设 计 器 中 通 过 图 形 表 达,只 能 是 调 用IWorkItem.loopTo(StringnextActivityId)实现。循环操作除了必须遵守“自由流”的条件外,还必须满足如下条件:目标环节已经被执行过。读者可以通过模拟器工具栏上的按钮对任意流程
26、模拟循环操作。2)相关 API8.略过(Skip)1)流程设计如下业务场景非常常见。某审批业务规定:当金额小于等于1 万元的情况下需要科领导审批;当大于 1 万元小于等于 10 万元时,除了科领导审批外还要送处领导审批;如果金额大于10 万元,则需要再往上送到局领导审批。对于这种业务模式有三种流程设计方法。第一种方法是设计一个顺序流程“申请-科领导批-处领导批-局领导批”,然后由业 务 代 码 根 据 申 请 的 金 额 调 用 IWorkItem.jumpTo(StringnextActivityId,ListnextActorIds)跳过不必要的审批级别。第二种方法是使用“委派”机制,操作
27、员根据业务管理规则人为地将任务呈送(委派)给上级领导。(该方案是否妥当还带斟酌.)第三种方法是利用“空环节”()实现略过,业务流程如下图名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 27 页 -在该流程中预先定义了一个“预算金额”流程变量,在“科长审批”后的相关流程分支中根据该变量进行判断。这个变量也可以不预先定义,因为Fire Workflow 允许在任何时候设置任何名称的流程变量,如果有同名的流程变量,则后值覆盖前值。流程定义文件是:Skip.xml2)流程模拟首先启动流程,然后点击,设置流程 变量“预算金额”的值。假设我们设置的值为2500,如下图。名师资料总结-精品资
28、料欢迎下载-名师精心整理-第 19 页,共 27 页 -在预算金额为25000 的情况下,流程执行完毕后的视图如下,可以看到“处领导审批”环节被执行了,而“局领导”审批环节被跳过了。9.会签通常情况下,会签是通过设置Task的 Assignment 属性来决定的,如果 Assignment 属性为 ALL,则该任务实例必须等到所有的WorkItem 结束后才会结束。Assignment 属性设置如下图:另一种情况会导致会签。在跳转的时候,如果下一个环节的Actor Id 有多个,且不需要签收,则工作流引擎会忽略Task 的 Assignment 属性。读者可以在“自由流”章节按照如下名师资料总
29、结-精品资料欢迎下载-名师精心整理-第 20 页,共 27 页 -图所示的参数模拟跳转,即可看到会签的效果。10.委派系 统 提 供 了 如 下 接 口 完 成 任 务 委 派IWorkItem.reasignTo(StringactorId),IWorkItem.reasignTo(StringactorId,String comments)。Fire Workflow 仅提供完成委派的接口,并不会按照某种业务规则真正执行委派操作。业务系统应该按照特定业务规则调用该接口实现委派。11.任务完成期限1)流程设计、模拟如果 Task 指定了Duration 属性,则工作流引擎会自动计算任务完成的
30、期限。以“Skip.xml”流程为例,如果“科长审批”的工作期限是2 个工作日,则Duration 属性设置如下图,名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 27 页 -启动该流程后,从模拟数据视图可以看到,相关 TaskInstance 的 Expired Time 被自动计算出来。如下图2)相关 API工 作 流 引 擎 把 获 得 系 统 时 间、计 算 任 务 完 成 期 限 等 工 作 委 派 给 日 历 服 务org.fireflow.engine.calendar.ICalendarService,Fire workflow提供了该接口的一个缺省实现。业务系
31、统可以实现该接口或者扩展org.fireflow.engine.calendar.DefaultCalendarService来解决用户自行调整上班时间、调整节假日的问题。更多信息请阅读:6_工作流引擎的结构及其扩展.pdf12.监听工作流事件Fire Workflow 的流程实例、任务实例在状态发生变化时都会产生相应的事件,业务系统可以在流程定义文件中注册相应的事件监听器来响应这些事件。1)TaskInstance事件监听器TaskInstance 的事件监听器必须实现org.fireflow.engine.event.ITaskInstanceEventListener。该 接 口 只 有
32、 一 个 方 法publicvoid onTaskInstanceFired(TaskInstanceEvent e)throwsEngineException。可以通过e.getEventType()来确定时间的类型。事件监听器必须在设计时注册到Task 的 Event Listener 属性中,如下图名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 27 页 -在模拟器中进行流程模拟时,如果Task 定义了事件监听器,则会在控制台中打印出监听器的名称,如下图2)ProcessInstance事件监听器ProcessInstance的事件监听器必须实现接口org.fireflo
33、w.engine.event.IProcessInstanceEventListener,该接口也只有一个方法:public voidonProcessInstanceFired(ProcessInstanceEvente)throwsEngineException。可以通过e.getEventType()来确定事件的类型。事件监听器必须注册在Workflow Process 的 Event Listener 属性中,如下图名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 27 页 -注:目前版本的模拟器并没有在模拟时将流程实例的事件监听器名称打印在控制台上。13.表单绑定Fir
34、e Workflow不提供所谓自定义表单功能,但是Form 类型的 Task 提供了相关的属性来存储表单信息。他们分别是:Edit Form:该成员变量存储了任务的编辑表单的url 等相关信息View Form:该成员变量存储了任务的只读表单的url 等相关的信息。List Form:该成员变量存储了任务的列表表单的url 等相关信息。各表单的属性设置界面如下名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 27 页 -14.流程元素属性详细说明1)所有流程元素通用属性2)WorkflowProcess的属性Workflow Process除了上述通用属性外,还有Event Li
35、stener 属性3)StartNode、Synchronizer、EndNode属性目前只有通用属性4)Activity属性除了通用属性外,还有如下属性属性名称属性说明ID元素的 ID。不可编辑,由设计器自动生成Name元素的名称Display Name元素的显示名称,例如在中文应用系统中可以为元素命名一个通俗易懂的中文名称。Description元素描述Extend Attribute扩展属性,是一个key-value 组成的 Map。您可以根据需要给元素增加任意多的扩展属性。属性名称属性说明Complete StrategyActivity Instance 的完成策略。可以取值 ANY
36、 或 ALL,缺省值为 ALL当取值为ANY 时,他的任何一个TaskInstance完成时都可以触发Activity Instance 执行 Complete()操作。当取值为ALL 时,只有当他所有的Task Instance 完成时,才出发 Activity Instance 的 Complete()操作。名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 27 页 -5)Transition的属性Transition 除了通用属性外,还有如下属性。6)SubflowTask 的属性子流程任务除了上述通用属性外,还有如下属性7)Tool Task 的属性8)Form Task
37、 的属性Form Task 除了通用属性外,还有如下属性属性名称属性说明Condition转移条件。是一个EL 表达式,如果此EL 表达式的计算结果为 true,则此转移分支将被执行,否则不执行。缺省值为空,为空时其值为true。转移条件除了EL 表达式外,还可以取值为一个字符串常量“DEFAULT”,只有当其他所有条件的值都是false 时,此转移才被执行,否则此转移不被执行。属性名称属性说明Sub-Workflow子流程的相关信息,如:子流程的 ID、Name、Display Name等。属性名称属性说明Execution取值为 SYNCHR 或者 ASYNCHR,缺省为SYNCHRSYN
38、CHR 为同步执行对应Application,ASYNCHR 为异步执行对应的ApplicationDuration(目前的 engine 对此属性没有处理。)ApplicationTask 执行的application,该 application handler 必须实现org.fireflow.engine.taskinstance.IApplicationHandler属性名称属性说明Performer操作者Assignment任务分配策略,取值为ANY 或 ALL,默认值是ANYANY 表示任何一个操作员完成该其工单则任务实例可以结束。ALL 表示收到工单的所有操作员都必须完成其工单,任名师资料总结-精品资料欢迎下载-名师精心整理-第 26 页,共 27 页 -务实例才能结束,即会签。Duration任务完成期限Default View缺省视图,取值为EditForm、ViewForm、ListForm,缺省值为 ViewFormEdit Form可编辑的表单信息,在此填入相关的url 可以用于链接业务表单View Form只读表单信息List Form列表表单信息。名师资料总结-精品资料欢迎下载-名师精心整理-第 27 页,共 27 页 -