工作流模式欢迎来到工作流原型模式。工作流原型模式可用于检验工作流服务器的表现能力,即工作流如何实现你所需的业务需求。本文档所含的模式由WilvanderAalst、BartekKiepuszewski、ArthurterHofstede及AlistairBarros收集并成档。且对下属工作流管理系统进行了评估:COSA、FLOWer、DominoWorkflow、Eastman、VisualWorkflow、ForteConductor、Meteor、Mobile、MQSeries/Workflow、Staffware、VerveWorkflow、I-Flow、InConcert、Changengine,以及SAPR/3Workflow.有关连接见模式、产品评测及文档。一、模式目录基本控制模式顺序(Sequence)--顺序执行任务;并行分叉(ParallelSplit)--并行执行任务;同步(Synchronization)--同步两个并行执行的线程;排它选择(ExclusiveChoice)--从多个路径种选择一个执行;简单合并(SimpleMerge)--合并两个可选执行路径。高级分支和同步模式多路选择(MultipleChoice)--从多个可选路径中选择几路执行;多路合并(MultipleMerge)--无同步合并多个执行路径;路径鉴别(Discriminator)--无同步合并多个执行路径,然并发任务仅执行一次;M并N(N-out-of-MJoin)--合并多个执行路径,实现部分同步,并发任务仅执行一次。同步连接(SynchronisingJoin)--合并多个执行路径,若多路执行则同步;若一路执行则简单合并(Simplemerge)。结构化模式任意循环(ArbitraryCycles)--执行工作流图时无任何环路限制;绝对终止(ImplicitTermination)--若无事可做时则终止。多实例调用模式同一任务多实例在流程设计时已知实例数目;同一任务的实例数目在运砖时某刻才能确定;同一任务的实例数目无法确知;同一任务多实例并要求同步。基于状态的模式隐含选择(DeferredChoice)--执行两个可选进程之一,选择执行进程是隐含的;交叉并行路由(InterleavedParallelRouting)--随机执行一个任务但不并行;里程碑(Milestone)--直到达到某个里程碑方激活一个任务。取消模式取消任务(CancelActivity)--取消(或禁止)一个激活任务;取消流程(CancelCase)--取消(或禁止)一个流程。二、顺序(Sequence)顺序模式是最基本的工作流模式。当两个或更多任务间存在依赖关系时需用顺序模式——在前一任务完成之前,本任务不能执行(调度)。描述在同一流程中,一个任务在另一任务完成后才能被激活。同义词顺序路由,串行路由。示例任务“发送账单”在任务“发送货物”之后才能执行。在检索到客户端文件后才能计算保险索赔。任务“累计航行里程”在任务“预订航班”后才能执行。建议1.顺序模式用于对工作流程中连贯的步骤建模,所有的工作流管理系统都支持该模式。三、并行分叉(ParallelSplit)当两个或更多任务需并行执行时需要并行分叉。除不要求任何程度并行支持的系统外大多数工作流引擎都较易支持并行分叉。描述在流程中,需将单进程的某控制点分成可并行执行的多进程控制,于是允许任务同时执行或以任何顺序执行。同义词与分支,并行路由,分叉。示例任务“付款”的执行,使得任务“装船”和“通知客户”同时执行能够。注册“保险索赔”后,两个并行子流程被触发:一个是“校核顾客符合的条款”,另一是评估实际损害。建议所有的工作流引擎都可能支持并行任务。可区分两种基本的方法:显性与分叉和隐性与分叉。支持显性与分叉结构的工作流引擎(诸如:VisualWorkflo)可定义一激活即使能的有多个流出转移的路由选择节点。支持隐性与分叉的工作流引擎(如MQSeries/Workflow)不提供特殊的路由选择结构——每个任务可有多于一个的流出转移,且每个转移都有相关条件。为达到并行执行的目的,流程设计者须保证流出转移的多个相关条件为真(典型的方法是将条件置为空)。四、同步(Synchronization)当两个并行任务都完成后下一任务才能开始执行时需要同步。描述流程中,多个并行子流程/任务在某点汇聚成一个单进程,从而同步多个进程。同义词与结合,结合,同步。示例任务“存档”在“送票”和“收费”两个任务完成后才能使能。“保险索赔”在“核定条款”和“估算实际损伤”后才能计算。问题本模式极易为所有支持并行运行的工作流引擎所支持。值得注意的是,对于某些实现,“与连接”的错误应用可能易于造成死锁。建议1.所有可用的工作流引擎支持本模式。典型的是具有可用的同步结构。在某些罕见的情形下,通过对一个多入口的任务定义特殊的开始条件实现同步。2.当具有显性的同步结构时,典型的特征是同步器应具有多于一个入口,却只有一个出口。例如,若任务C之前有一以任务A和任务B为输入的同步器,如果已有任务A的实例,当它执行完毕时,同步器将不作处理,而是等待任务B的实例的终止。另一方法是,在等待任务B时,简单地明了任务A的“额外”实例的数目,然后用相应的任务B的实例匹配它们。五、排它选择描述在流程的某一点,依据一个结果或流程控制数据,从多个分支路径中选定一个路径。同义词异或分叉,条件路径,开关,决议。示例任务“计算赔偿金”后继是两个任务“支付赔偿金”和“联系顾客”中的任一个。建议1.类似于“并行分叉”,有两种基本策略——某些工作流引擎提供显性的结构以实现“排他选择”模式(譬如Staffware,VisualWorkFlo),但是在其它工作流引擎(MQSeries/Workflow,Verve)中,流程设计者不得不选择转移条件仿效“排他选择”。六、简单合并欲将选择执行的路径合并成一个路径需用“合并”模式。描述在流程中某点,需将两个或更多可选分支聚合而不同步;换言之,“合并”在任一入口连接触发时被触发。同义词异或连接,,异步连接,合并。示例任务“存档索赔”在任务“支付赔偿金”和“联系顾客”任一之后使能。七、多重选择(MultipleChoice)描述在工作流过程的某点,依据判定或工作流控制数据,选择一个或多个分支。同义词条件路径,选择,或分叉。示例执行任务evaluate_damage之后任务contact_fire_department或contact_insurance_company被执行,至少其中之一被执行,但是,也可能两者都被执行。问题很多工作流管理斜体中,转移上可以定义条件。这些系统中可直接实现OR-分叉,但是有几种工作流管理系统不能在转移上设置条件,仅提供纯粹的AND-split和XOR-split建模元素(例如Staffware)。建议1.正如所述,对于可在转移上设置条件的工作流管理系统(诸如Verve,MQSeries/Workflow,ForteConductor)实现多重选择是直截了当的,流程设计者只需简单地设定每一转移的条件即可。值得注意的是多重选择是并行分叉和排它选择的泛化。2.多重选择的实现需要将并行分叉和排它选择二者结合起来。每一可能的分支由一前置的异或分叉基于控制数据决定,或者激活该分支,或者跳过它。所有异或分叉由一与分叉激活,该与分叉也可用于设置异或分支所用的控制数据。3.另一与上述方案类似的方案是颠倒与分叉和异或分叉的结构顺序。每组可激活的并行分支,加入一与分叉。所有与分叉由一前置的异或分叉激活适当的与分叉。注意并非所有的分支组合可行的。所以本方案将导致简单的工作流定义。八、多路合并(MultipleMerge)本模式旨在阐述简单合并模式中提及的问题,即当一个合并中有多于一条流入转移被激活时的情形。描述多路合并是指在流程中某点,两条或更多分支无同步再收敛。若多于一个分支被激活,可能同时被激活,任务后的合并对于每条流入的激活分支都响应一次(亦即,在上图中,D将被实例化两次)。示例有时两个或更多并行的分支共享一个终点。此类情况的翻版是(可能复杂的)流程中每一分支可用一个多路合并。一个简单的例子是两个并行运行的任务audit_application及process_application,二者都后接任务close_case。问题大多数工作流引擎(诸如Staffware,HPChangengine,I-Flow)若一个任务的第一个实例仍在运行时,将不产生第二个实例。VerveWorflow和ForteConductor例外。建议如果多路合并不是循环(loop)的一部分,作为一个任务不能创建多于一个实例的语言的通用设计模式是在工作流模型中复制该任务。如果多路合并是循环(loop)的一部分,典型的情况是多路合并其后所接的任务的数目在设计(建模)时未知。关于这个问题的典型方案,见有关多实例模式。九、路径鉴别器(Discriminator)本模式可以看作多路合并模式的逆。其语义实现是合并后仅一个任务应被实例化。描述路径鉴别器是指在流程的某点,激活后续任务之前等待许多流入分支的完成。从它开始之时起,等待所有剩余分支的完成并“忽略”它们。一旦所有的流入分支都被触发,它使自己复位,以便可被再次触发示例一篇论文需被送给外部审阅者。如果两个评价皆为正,则论文被接受;如果第一个评价为负,应提示作者,不必等待第二个评价。为缩短查询响应时间,一个复杂的查询通过internet被送往两个数据库。第一个给出结果后流程将继续流转,第二个结果将被忽略。问题一些工作流引擎(如Staffware,HPChangeEngine,I-Flow),若任务的第一个实例仍在运行,则生成该任务的第二个实例。然而,这不能提供一个路由鉴别解决方案,因为只要该任务的第一个实例完成,第二个实例将被创建。建议1.Verve中有一个特殊的结构实现路由鉴别语义。2.支持定制触发器的产品可实现路由鉴别功能(详见M中选N)3.所有其它的工作流引擎很难或无法实现路由鉴别功能。通用的设计模式是采用取消任务模式。只要路由鉴别后接任务的第一个实例被创建,仍未完成的流入分支的任务可被取消,如此第二个实例将不会被创建。模式见下图。本方案的问题是若任务B和C同时完成,任务D可能仍将执行两次。此外,路由鉴别的原有语义是允许B和C都完成。本方案任务B或C将被取消。十、M中选N合并(N-out-of-MJoin)下述模式可视作基本路由鉴别的泛化,意欲从M个流入转移中同步N个线程。描述M中选N合并是指流程的某点M条并行路径聚合到一点,只要其中N条路径完成则激活后续任务,所有其它剩余路径的完成应被忽略。类似于路由鉴别,只要所有流入分支被触发,则该合并使自己复位,以便可被再次触发。同意词部分合并,鉴别器,定制合并。示例一篇论文需送往三个外部的审阅者。收到两个评审后继续处理论文,第三个评审将被忽略。问题大多数工作流产品不提供结构以直接实现M中选N合并。建议1.某些工作流引擎(如ForteConductor)提供对定制触发器的支持。对于具有多于一个流入转移的任务可定义定制触发器,它定义条件,典型地使用某些内部脚本语言,当条件计算为真时,激活该任务。这样的脚本很容易用于定义与M中选N等价的语义。该方法的缺点是采用定制触发器语义的合并,不仔细检验触发器脚本是无法定义的,亦将导致模型的不当和难于理解。2.通过Bycomb融合路由鉴别模式和同步模式(Discriminator与Synchronisation),可达到同样目的,尽管工作流定义(或模型)会变得大而复杂。下图所示为一3中选2合并的例子。十一、同步合并(SynchronisingJoin)现代的工作流产品很容易处理多路选择模式。不幸的是,对应于合并(Or-Join)结构的实现却极度困难。OR-join应具有同步并发流及合并可选流的功能。困难在于决定何时同步,何时合并。同步可选流导致可能的死锁,合并并发流