工作流引擎是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。工作流引擎是为工作流实例提供执行环境,它是工作流管理系统的核心服务,因此,工作流引擎设计的好坏直接关系到工作流的执行效率与可扩展性。
工作流引擎是工作流管理系统中为过程实例和活动实例提供运行环境的服务软件,是整个工作流管理系统的核心,工作流引擎的主要功能有:
(1)、解释流程定义
(2)、创建流程实例(人工创建、自动创建;自动创建又包括自动定时创建和自动周期创建)
(3)、控制过程实例(流程实例的创建、运行、挂起、中断、恢复、终止等)
(4)、控制活动实例(活动实例的创建、运行、挂起、中断、恢复、终止等)
(5)、控制工作任务(工作任务的创建、运行、挂起、恢复、终止等)
(6)、与外部资源交互完成各项活动
(7)、维护工作流控制数据和工作流相关数据
工作流系统在实际应用分为三个阶段:模型定义、模型实例和模型执行。
?? 模型定义:利用流程建模工具设计用户业务流程。
?? 模型实例:定义的模型导入到运行库,并做好状态初始化,并分配每个活动执行所需的资源(设备、参与者等)。
?? 模型执行:根据运行库的状态,条件的判定,推动流程的状态跃迁,并完成之,同时对过程与活动的执行情况进行监控与跟踪。
总的来说,引擎就是一台状态机,里面充斥了各种工作流对象的瞬时状态,状态之间的变迁也会相互影响,并且提供了接口让外界的系统了解里面的工作流对象的当前状态。
工作流对象包括3种:过程,活动,任务。每个对象的状态有所不同,各个对象之间的状态跃迁会相互之间有所影响。
工作对象中的过程实例、活动实例、工作任务之间的包含依赖关系如下:
过程实例的基本状态可以概括为如下六种:初始(Initiated)、运行(Running)、挂起(Suspend)、中断(Abort)、终止(Terminate)、完成(Complete)。
这几种状态之间存在着基本的状态转换,如下图所示:
发生状态转换的原因可能是由于工作流引擎响应外部的特殊命令(如某个改变状态的外部事件到来),也可能是因为满足了过程定义中指定的状态转换条件(如一个时间依赖的状态变换到达了规定的时间,或者数据依赖的状态变换满足了数值的要求)、基本的状态介绍如下:
(1)、初始(Initiated)
一个过程实例已经被创建,包括创建一些相关过程状态数据和工作流相关数据,如分配该流程实例的ID,取得过程的初始相关数据及激活条件等。但是该过程实例还没有收到并响应一个启动过程实例的事件。处于初始状态的过程实例一定得通过启动过程事件(如创建开始活动、将过程初始相关数据赋予开始活动以及启动开始活动等行为事件)来开始整个过程实例的运行。
状态转换:合适的条件下,初始状态可以转换变迁到其他的状态。
A、初始==》运行
过程实例创建完成后,接受到启动过程实例的事件,则过程实例将变迁到运行状态,接着可以创建合适的活动实例。
B、初始==》删除
处于初始状态下的过程实例,此时还没创建活动实例,当接受到用户删除的请求后,自动删除本过程实例,及相关业务数据。
(2)、运行(Running)
过程实例已经激活启动执行,当处于运行状态下的过程实例必须满足至少一个活动实例处于运行状态。当满足条件的情况下,过程实例所包含的初始状态任何一个活动实例都可以被激活启动运行。
状态转换:不同情况下,运行状态可以转换变迁到其他的状态。
A、运行==》挂起
当处于运行状态下的过程实例被有权限的用户发出挂起事件,或由于工作流引擎自身处理异常导致发出过程实例挂起事件,有流程引擎将过程实例的状态变更为挂起状态。挂起过程实例将导致所有处于运行状态的活动实例和处于运行、领用状态下的工作任务都将被挂起。
B、运行==》终止
过程实例没有正常结束,而是在运行中被有操作权限的用户终止,终止运行状态的过程实例将导致所有未完成的活动实例和工作任务消失。
C、运行==》完成
当所有的活动实例都正常结束时,过程实例发现除了结束活动外再没有其他可以执行的活动,则过程实例进入结束活动,调用结束活动的完成方法,过程实例进入完成状态。
(3)、挂起(Suspend)
过程实例处于一种不活动的状态,在该状态下,不能启动和操作任何活动实例和工作任务,除非过程实例已通过一个恢复过程实例事件或重启动事件返回到运行状态。
导致过程实例挂起的基本原因有如下情况:
(1)、工作流引擎的主动挂起:即运行到某个时刻,工作流引擎在导向下一个活动时出现异常,并且不能跳转到可执行的行为时,便主动将过程实例挂起。
(2)、工作流引擎的被动挂起:即运行到某个时刻,当有操作权限的用户由于某种原因发出一个挂起事件给工作流引擎,工作流引擎会先记录下该命令,等所有活动实例都结束、终止、挂起时,工作流引擎便立即将过程实例挂起而不去理会下一步如何流转。
上述两种过程实例的挂起,都将同时把过程实例中处于运行状态的活动实例和处于运行、领用状态下的工作任务挂起,这种活动实例或工作任务的挂起与过程实例在挂起前已经被挂起的活动实例或工作任务在恢复时将通过一个最近状态改变事件属性来加以区别。如果在过程实例挂起前活动实例或工作任务已经被挂起,则在挂起时只是修改过程实例的最近状态改变时间。在进行恢复时也是通过比较活动实例或工作任务和过程实例的最近状态改变事件来进行恢复:如果过程实例和活动实例或工作任务的最近状态改变事件一致,则在恢复过程时将活动实例或工作任务同时进行恢复;如果不一致,则只是恢复过程实例,而活动实例或工作任务则继续保持挂起状态。
状态转换:不同情况下,挂起状态可以转换变迁到其他的状态。
A、挂起==》运行
工作流引擎收到恢复命令。如因为有权限的用户修改了模版或者重新分配工作任务后,又恢复运行。恢复过程实例时将同时恢复过程实例挂起时被同时挂起的活动实例和工作任务。
B、挂起==》中断
工作流引擎收在处理过程中发现了过程实例的挂起时间超过过程实例的生存周期,便从挂起异常情况下直接中断过程实例。中断一个被挂起的过程实例将使所有未完成的活动实例和工作任务消失。
C、挂起==》终止
处于挂起状态下的过程实例接受到有权限的用户发出的终止过程的命令,工作流引擎自动执行将过程实例转换到终止状态。 终止一个被挂起的过程实例将使所有未完成的活动实例和工作任务消失。
(4)、中断(Abort)
过程实例处于中断状态下,说明过程实例已经结束。只有在过程实例处于挂起的状态下,当工作流引擎在处理过程中发现过程实例的挂起时间超过过程实例的生存周期,便从挂起异常情况下执行中断事件,结束过程实例。中断状态也是状态转换中的最后一个状态,从此不再有状态转换行为发生。
(5)、终止(Terminate)
在正常结束之前该过程实例的执行已被结束。内部的操作(如错误登记、数据恢复、发出终止事件等)执行终止结束过程实例。终止状态也是状态转换中的最后一个状态,从此不再有状态转换行为发生。终止一个过程实例将终止该过程实例所有未完成的活动实例和工作任务。
(6)、完成(Complete)
过程实例已经满足了结束条件,被正常结束,并记录内部的日志数据或统计数据。所有的行为按照业务流程的要求流转完毕,即已经完全或者基本达到了过程实例生成者的设计目的,完成状态是状态转换中的最后一个状态,从此不再有状态转换事件发生。只有处于运行状态的过程实例发现除了结束行为外再没有别的可执行的活动时,创建结束活动实例并调用其完成方法后得到的状态才是完成状态。这意味这该结束不是由于任何强迫行为所导致的结果,而是活动实例和工作任务按照预定的方案进行正常的状态转换所形成的结果。
活动实例状态变迁
活动实例的基本状态可以概括为如下:初始(Initiated)、运行(Running)、挂起(Suspend)、中断(Abort)、终止(Terminate)、完成(Complete)。
这几种状态之间存在着基本的状态转换,如下图所示:
(1)、初始(Initiated)
活动实例已经被创建,处于初始状态情况下,但是还没有符合开始激活启动运行的条件,即还没有创建工作任务。
状态转换:合适的条件下,初始状态可以转换变迁到其他的状态。
A、初始==》运行
当活动实例中至少一个工作任务已经被创建并且满足激活启动运行的条件,即至少一个工作任务处于运行或领用状态下,活动实例状态将自动变迁为运行状态。
B、初始==》删除
当接受到终止过程实例的命令后,处于初始状态的活动实例将自动被引擎删除。
(2)、运行(Running)
活动实例中至少一个工作任务已经创建并且激活启动运行(至少一个工作任务状态处于运行或领用状态)。如果是人工活动则分配给指定的活动实例参与者来处理,如果是自动活动则分配给任务调度引擎来处理。此时的活动实例的状态为运行。
针对人工活动的活动实例与参与者之间的关系有两种:独占式和分布式。独占式是指活动实例的工作任务可由活动实例参与者中的任一个独立完成,并且一旦其中的一个参与者处理后,其他参与者便不能再处理。分布式是指活动实例的工作任务被复制给活动实例的所有参与者,所有参与者全部处理后才能有效。
状态转换:合适的条件下,运行状态活动实例可以转换变迁到其他的状态。
A、运行==》挂起
当处于运行状态下的活动实例接受到用户发出的挂起事件时,引擎自动将活动实例的状态变迁为挂起状态。该挂起事件将导致该活动实例的所有处于运行或领用状态下的工作任务被挂起。这种工作任务的挂起和在活动实例执行挂起时已经被挂起的工作任务,在活动实例执行恢复时通过使用一个最近状态改变事件属性来进行区别对待;如果工作任务的最近状态改变时间和活动实例的最近状态改变时间相同,则表明该工作任务是由于活动实例挂起而被挂起的,在活动实例恢复时对其进行恢复;如果活动实例和工作任务的最近状态改变时间不同,则表明在活动实例挂起之前此工作任务已经被挂起,在恢复时不对其进行恢复。
B、运行==》终止
当处于运行状态下活动实例接受到用户发出的终止事件后,引擎自动将活动实例的状态变迁为终止状态。终止活动实例将导致所有未完成的工作任务消失。
C、运行==》完成
当处于运行状态下活动实例接受到工作任务处理完成的命令后,将正常结束完成本活动实例。
(3)、挂起(Suspend)
活动实例处于一种不活动的状态,在该状态下,不能启动和操作任何本活动下的工作任务,除非活动实例已通过一个恢复活动实例事件或重启动事件返回到运行状态。
状态转换:不同情况下,挂起状态可以转换变迁到其他的状态。
A、挂起==》运行
工作流引擎收到恢复活动实例命令。恢复活动实例时将同时恢复活动实例挂起时被同时挂起的工作任务。
B、挂起==》中断
工作流引擎在自动处理过程中发现此活动实例的挂起时间超过活动实例的生存周期,便从挂起异常情况下中断活动实例。中断一个被挂起的活动实例将使此活动下所有未完成的工作任务消失。只有这种情况下才能从挂起到中断的状态变迁。
C、挂起==》终止
处于挂起状态下的活动实例接受到有权限的用户发出的终止活动的命令,工作流引擎自动执行将活动实例转换到终止状态。终止一个被挂起的活动实例将使此活动下所有未完成的工作任务消失。
(4)、中断(Abort)
活动实例处于中断状态下,说明活动实例已经结束。只有在活动实例处于挂起的状态下,工作流引擎在自动处理过程中发现活动实例的挂起时间超过活动实例的生存周期,便从挂起异常情况下执行中断事件,结束过程实例。中断状态也是状态转换中的最后一个状态,从此不再有状态转换行为发生。
(5)、终止(Terminate)
活动实例的执行被异常结束,即活动实例的参与者没有全部提交工作任务便被终止。活动实例不允许用户对其直接进行终止,只有当有权限的用户在终止过程实例时而被该过程实例中的活动实例处于初始、挂起、运行状态时候,才可以对其进行终止。终止处于挂起、运行状态的活动实例将导致活动实例的多有未完成的工作任务终止。终止状态也是状态转换中的最后一个状态,从此不再有状态转换行为发生。终止一个活动实例将终止该活动实例所有未完成的工作任务消失。
(6)、完成(Complete)
活动实例的执行正常结束,并且引擎将取得并评估该活动的后继条件,以决定后续行为。即该活动实例的所有参与者都被成功提交了各自的工作任务。完成状态是活动实例变化中最后一个状态。
工作任务状态变迁
工作任务的基本状态可以概括为如下:初始(Initiated)、运行(Running)、领用(Receive)、挂起(Suspend)、拒绝(Reject)、终止(Terminate)、完成(Complete)。
这几种状态之间存在着基本的状态转换,如下图所示:
(1)、初始(Initiated)
工作任务已经被创建,但是还没有满足激活启动运行的条件。
状态转换:如下情况可导致工作任务从创建变迁到另外的状态:
A、初始==》运行
当工作任务满足被激活启动运行的条件后,状态将自动变迁为运行状态。
B、初始==》删除
工作流引擎接受到终止过程实例(或终止活动实例)的命令后,将自动清除处于初始状态的工作任务。
(2)、运行(Running)
工作任务已经满足被激活运行启动的条件,工作任务处于运行状态。
状态转换:合适的条件下,运行状态工作任务可以转换变迁到其他的状态。
A、运行==》挂起
当处于运行状态下的工作任务接受到用户发出的挂起事件时,引擎自动将工作任务的状态变迁为挂起状态。
B、运行==》领用
当工作任务的参与者打开了分属于自己的工作任务,此时工作任务将自动变迁为领用状态。
C、运行==》终止
当处于运行状态下工作任务接受到用户发出的终止事件后,引擎自动将工作任务的状态变迁为终止状态。只有活动实例被终止情况下才可能终止工作任务,用户不能自己终止工作任务。
(3)、领用(Receive)
当处于领用状态的工作任务说明已经被参与者打开过,则说明工作任务已经 被领用。
A、领用==》挂起
当处于领用状态下的工作任务接受到用户发出的挂起事件时, 引擎自动将工作任务的状态变迁为挂起状态。
B、领用==》终止
当处于领用状态下工作任务接受到用户发出的终止事件后,引擎自动将工作任务的状态变迁为终止状态。只有活动实例被终止情况下才可能终止工作任务,用户不能自己终止工作任务。
C、领用==》拒绝
当工作任务的执行者拒绝执行分配的工作任务,则工作流引擎将该工作任务变迁到拒绝状态,拒绝状态是状态转换中的最后一个状态,从此不再有状态转换行为发生。
D、领用==》完成
当工作任务的执行者已经按照预定的要求完成了工作,并且向工作流引擎成功提交了工作结果,该工作任务便进入完成状态。
(4)、挂起(Suspend)
工作任务变为一种不活动的状态,该状态下,参与者不能打开该工作任务,除非它已经回到了运行或者领用状态下。
状态转换:不同情况下,挂起状态可以转换变迁到其他的状态。
A、挂起==》运行
工作流引擎收到恢复工作任务命令。在变迁到挂起前的状态为运行状态,则引擎自动恢复成运行状态。
B、挂起==》领用
工作流引擎收到恢复工作任务命令。在变迁到挂起前的状态为领用状态,则引擎自动恢复成领用状态。
C、挂起==》终止
处于挂起状态下的工作任务接受到有权限的用户发出的终止活动的命令,工作流引擎自动执行将挂起状态下的工作任务转换到终止状态。
(5)、拒绝(Reject)
工作任务参与者拒绝参与执行分配的任务项,处于拒绝状态下的工作任务属于结束状态,拒绝状态是状态转换中的最后一个状态,从此不再有状态转换行为发生。拒绝属于非正常结束工作任务。
(6)、终止(Terminate)
工作任务的执行被异常结束。在工作任务处于挂起、运行、领用状态时才能被终止。工作任务不能有用户直接进行终止操作,只有有权限的用户在终止过程实例而终止其所属的活动实例时,才能对工作任务进行终止。
(7)、完成(Complete)
工作任务执行完成正常结束,参与者按照要求完成了分配的工作任务。
只有处于领用状态下的工作任务在成功提交后才能到达完成状态。活动实例的所有工作任务都正常结束时,活动实例的状态也到达完成状态。
过程、活动、任务整体状态变迁
过程实例、活动实例、工作任务这三个工作流对象之间的整体的状态的变迁及变迁过程中相互的影响关系。三个对象的几种状态之间存在着基本的状态转换,如下图所示:
流程模式
工作流基本包含如下多种模式用于工作流过程建模和分析:
(1)、基本模式 5种
● 顺序模式---- 按照顺序执行各项活动
● 并行分支模式----同时运行两个活动
● 同步模式----同步两个并行的执行线程
● 单选模式----从多条路径中选择一个执行
● 简单合并模式----合并两个二选一路径
(2)、高级分支与同步模式 5种
● 多选模式----从多条执行路径中选出几条
● 同步合并模式----合并多条路径,如果有多条路径被选择,则进行同步;如 果只有一条路径被选择,则进行简单合并
● 多合并模式----合并多条路径
● 鉴别器模式----合并多条路径而不进行同步,只执行一次后续活动
● M中的N模式-----合并多条路径,进行部分同步,只执行一次后续活动
(3)、结构模式 2种
● 任意循环模式----没有任何限制的执行工作流
● 隐含终断模式----如果没有事情可做,就结束
(4)、多实例模式
● 设计期多实例---流程设计时已知实例数目
● 运行时前置多实例---实例数目在运行时才能确定
● 运行时非前置多实例---实例数目无法确定
● 同一任务多实例并要求同步运行
(5)、基于状态模式
● 延期选择---执行两个可选进程之一,选择执行进程是隐含的
● 交叉并行路由---随机执行一个任务但不并行
● 里程碑---直到达到某个里程碑方激活一个任务
(6)、取消模式
● 取消活动---取消或禁止一个活动
● 取消过程---取消或禁止一个过程
(7)、其它模式
● 结构化循环
● 递归
● 临时触发器
● 持续触发器
● 取消范围
● 多实例的取消
● 多实例的手工完成
● 鉴别阻塞
● 鉴别取消
● 结构化N选M
● N选M阻塞
● N选M取消
● AND合并
● 多实例的N选M
● 多实例的N选M取消
● 动态多实例的N选M
● 循环的同步合并
● 同步合并
● 区域互斥
● 交叉路由
● 线程合并
● 线程分支
● 显式终止
基本模式
(1)、顺序模式(Sequence)
最基本的过程模型:按照顺序执行各项活动,前驱活动的完成是后续活动开始的必要条件,每一个工作流系统都直接实现了这种模式,这个模式是工作流能运行的一个重要基石。
这个理论模型十分简单,只是一个工作单元完成了,紧接着无条件执行下一个工作单元。
(2)、并行分支模式(Parallel Split)
在流程执行过程中,需要将单进程的某个控制点分成可以并行执行的多进程控制,于是允许任务同时执行或者以任何顺序执行。此一模式,实际就是我们常接触到的 AND 模型。
值得注意的是这个定义来说一般B、C、D之间是并发的,实现上一般是几个不同的线程/进程。
(3)、同步模式(Synchronization)
AND分支以后,一个最为普遍的合并方式就是AND合并。当多个并行任务都完成后才能开始执行下一任务。
需要注意的细节是"同步"这个问题,很多时候存在现实业务的考虑,即使是同一个动作,也不一定是非要合并不可。
一般情况下,并行分支和合并是组合使用,组合执行模型如下:
(4)、单选模式(Exclusive Choice)
单选模式其实就是“排它选择”模式,在流程的某一节点,依据一个结果或流程控制数据, 从多个分支路径中选定一个路径执行。
需要注意的是这个"排他"性,只能选择其中一个分支,另外多个分支将不会走下去。一般来说,这个模式的实现一般为在运行时的条件选择,就是条件判断的代码放到XOR 这个结点,然后去根据这些代码去判断下一步的走向。
(5)、简单合并模式(Simple Merge)
在流程中某点,需将两个或更多可选分支聚合而不同步;换言之,“合并”在任一入口连接触发时被触发。
这个模式主要是为了应付前躯只有一个分支的流程,这个模式也是一个很常用的模式。在许多的流程图中,没有显式说明的一般都可以看作是 XOR-join,就是任意一个前躯完成,就触发下一个工作单元。
一般情况下,单选模式和简单合并模式是组合使用的,组合模式如下:
高级分支与同步模式
(1)、多选模式(Multiple Choice)
在工作流过程的某点,依据判定或工作流控制数据,选择一个或多个分支来进行执行。通常意义上来讲就是我们所说的OR_Split
(2)、同步合并模式(Synchronising Join)
流程中某点多条路径聚合成一个线程,若多于一条路径触发,则活动线程需同步;若仅有一条路径触发,则可选分支应再收敛,无需同步。
工作流程中的多个路径在一个点被汇合成一个单一的进程。如果多于一个的路径到达了,活动线程就需要进行同步。如果只有一个路径到达,那么其它的路径应该异步的重新会聚。
这一个模式是为了应付多选模式(Multiple Choice)或者通常意义所说的 OR-Split 所产生的分支。
说明:这个分支的合并,需要了解上下文的关系。如果前面只产生了A分支,那么到达同步-JOIN节点就可以触发后续活动D。如果前面产生的分支A、B、C都被激活触发,并且A、B、C分支是并发的,那么当A、B都已到达同步-JOIN节点,但是C分支还没有到达,那么就需要进行等待,等到C分支也到达本节点后,才能触发执行下一节点D活动。
(3)、多合并模式(Multiple Merge)
多合并模式即多路合并,在流程中某节点,两条或更多分支无同步再收敛。若多于一个分支被激活或多个分支被同时激活,流程需要对每个被激活分支进行响应一次,则需要采用多合并模式。其实多路合并并不是真正意义的合并,而是到达多路_JOIN节点时继续相同的后续分支。
说明:如图所示,B\C\D三个活动,当B先到达“多路_JOIN”节点时,则触发E1,C到达时候,触发E2,D到达时候,触发E3,触发完成全部分支后,E触发完成结束。其实每次触发的都是相同的E,但是产生的任务为E1,E2,E3,他们是对每一个流入的分支都进行响应一次功效。当全部触发完成后,流程继续进入E后续的流程活动。
(4)、鉴别器模式(Discriminator)
路径鉴别器是指在流程的某点,激活后续任务之前等待许多流入分支的完成。从它开始之时起,等待所有剩余分支的完成并“忽略”它们。一旦所有的流入分支都被触发,它使自己复位,以便可被再次触发。
鉴别器模式只只对And_Split同时执行的情况;此种模式有三种情况:
(1)、B、C同时到达鉴别器Discriminator节点,则执行D
一般这种情况不会发生,因为计算机执行的时候,总是有先后执行顺序的,总有一个为先执行。
(2)、B先到达鉴别器Discriminator节点,那么就不必等待C的执行结果,直接执行D,当C到完成后到达鉴别器Discriminator节点时,流程将自动忽略C的结果,将鉴别器Discriminator恢复原位,继续等待被触发。
(3)、C先到达鉴别器Discriminator节点,那么就不必等待B的执行结果,直接执行D,当B到完成后到达鉴别器Discriminator节点时,流程将自动忽略B的结果,将鉴别器Discriminator恢复原位,继续等待被触发。
(5)、M中的N模式(N-out-of-M Join)
M中选N合并是指流程的某点M 条并行路径聚合到一点,只要其中N条路径完成则激活后续任务,所有其它剩余路径的完成应被忽略。类似于路由鉴别,只要所有流入分支被触发,则该合并使自己复位,以便可被再次触发。M中选N其实就是合并多条路径,进行部分同步,只执行一次后续活动。
说明:上图所示 M 为3,N我们设定为2 ,则,如果B\C 都完成到达N-out-of-M Join节点,则满足N-out-of-M 规则,则不必等待D的执行结果,直接转向执行E;当D完成后到达N-out-of-M Join节点,流程则忽略D的执行结果,将N-out-of-M Join节点复位等待再次被触发。
结构模式
(1)、任意循环模式(Arbitrary Cycles)
在工作流过程的执行过程中,一个或多个任务可被重复执行。
(2)、隐含终断模式(Implicit Termination)
这个模式叫隐式结束,或者自然结束。就是当所有正在运行结点都没有后继结点,流程就视为结束了。也就是不需要指明结束的结点,只要跑完所有的结点(或者没有找到后继结点),就视为流程结束。
多实例模式
(1)、设计期多实例(Multiple Instances with a Priori Design-Time Knowledge)
流程中的某个任务可能需要创建多个实例,其数目在设计模型时已知。即在某种情形下,一个任务被激活多次,其指定任务在给定情况下实例的个数在设计时已知。这一模式是用于确立多实例的入口方式。入口主要处理的问题就是确定所需要生成的实例个数 N 。而这个 N 在设计流程的时候就确定了。
(2)、运行时前置多实例(Multiple Instances with a Priori Run-Time Knowledge)
一个任务的实例个数是动态的,亦即在设计时未知,而在运行期间所有实例需被执行前的某点可获知其数目。可以将本模式看作一初始化该任务的For循环。在某种情况下,任务可被激活多次,给定任务的实例数在指定情形下是一变量,取决于情况特征或资源的可用性, 但在运行期的某些阶段才已知, 即该任务的实例在运行时候才确定。
入口方式也可以动态确定,这一模式是表示在流程运行的过程中,B 中第一个实例产生以前就确定 N 。当然了,确定这个N 的时机可以是前面 A,也可以是 A 前的工作任务。总之是在第一个实例产生前就确定下来的,也可以视作该模式的应用。
(3)、运行时非前置多实例(Multiple Instances without a Priori Run-Time Knowledge)
实例的数目是动态的,亦即实例数设计时不知,在运行期间,所有这些实例需要被激活前的任何阶段都无法知道。可将本模式看作是任务实例化的WHILE循环。
(4)、同步多实例(Multiple Instances without a Priori Run-Time Knowledge)
实例数在设计时未知,任务的所有实例完成后另一任务才能启动(或开始)。
基于状态模式
(1)、延期选择(Deferred Choice)
一个线程激活任务A, 另一线程激活任务 B,而两个任务都在任务列表中),只要一个线程启动, 另一线程应消失(亦即若任务 A 启动,则任务B 应从工作列表中消失)。
工作流中的一个节点,有一个或多个分支已经被选择。与XOR拆分相比,并没有明确的选择,但是,选择是取决于环境的。与AND拆分相比,两者中只有一个被执行。这意味着一旦环境启动了其中的一个,另一个就被取消。要注意,选择是被延迟到两个分支中的一个真正开始执行时,也就是说,选择是可以尽可能的推后的。 例子:在收到货物之后,有两种方法可以将其送到。选择取决于相关资源的可用性。因此,选择会被推迟到直到其中一个资源可用为止。
(2)、交叉并行路由(Interleaved Parallel Routing)
一组活动以任意的顺序执行,每个活动都被执行,他们的顺序是在运行时决定的,并且在任意一个时刻都不会有两个活动在执行。
(3)、里程碑(Milestone)
一个活动能否执行取决于一个指定的状态。也就是说,只有在到达一个特定的未过期的里程碑时,活动才被执行。
取消模式
(1)、取消活动(Cancel Activity)
一个可执行的活动被强制失效了,也就是说,一个正在等待执行的活动所在线程被移除了。
例子:如果顾客取消了一个请求,那么与之相关的活动也被取消了。
(2)、取消过程(Cancel Case)
一个过程实例, 被完全取消。
其它模式
(1)、结构化循环(Cancel Activity)
(2)、递归(Recursion)
(3)、临时触发器(Transient Trigger)
(4)、持续触发器(Persistent Trigger)
(5)、取消范围(Cancel Region)
(6)、多实例的取消(Cancel Multiple Instance Activity)
(7)、多实例的手工完成(Complete Multiple Instance Activity)
(8)、鉴别阻塞(Blocking Discriminator)
(9)、鉴别取消(Cancelling Discriminator)
(10)、结构化N选M(Structured Partial Join)
(11)、N选M阻塞(Blocking Partial Join)
(12)、N选M取消(Cancelling Partial Join)
(13)、AND合并(Generalised AND-Join)
(14)、多实例的N选M(Static Partial Join for Multiple Instances)
(15)、多实例的N选M取消(Cancelling Partial Join for Multiple Instances)
(16)、动态多实例的N选M(Dynamic Partial Join for Multiple Instances)
(17)、循环的同步合并(Acyclic Synchronizing Merge)
(18)、同步合并(General Synchronizing Merge)
(19)、区域互斥(Critical Section)
(20)、交叉路由(Interleaved Routing)
(21)、线程合并(Thread Merge)
(22)、线程分支(Thread Split)
(23)、显式终止(Explicit Termination)
过程推进
过程推进是针对工作流系统正常流转的一个整体的引擎调度流程,它是工作流系统完整流转的整体过程描述。
(1)、业务创建
用户在WEB端创建单据
业务流程创建业务单据、公文流程编制文稿数据,此时业务单据的状态为草稿状态,同时产生一条状态为【初始】的过程实例。如果用户删除业务单据,则同时删除产生的过程实例。
(2)、流程启动
第一步完成后,启动工作流程。流程的启动方式分多种,手工启动、自动启动、事件启动、邮件启动、外部启动等。
<A>、将流程定义模型导入到运行库(工作流流程的执行情况表)中;运行库包含如下内容:
● 过程执行情况:生成过程记录,状态为【初始】
● 活动执行情况:
● 任务执行情况
<B>、将过程实例状态变迁为【运行】
<C>、生成所有活动的活动实例。
<D>、将第一开始活动的活动实例状态变迁为完成。
<E>、生成开始活动的工作任务,将状态变迁为完成。
<F>、更新运行库记录。将过程记录状态变更为【运行】,生成一条第一开始活动的执行情况记录,状态为【完成】,生成第一活动的任务执行情况记录,状态修改为【完成】。
(3)、过程执行
流程启动后,SDP工作流流程的设计模式是已经完成了第一开始活动的所有任务,直接进行第二活动的执行,此时整个过程开始真正的执行,那么我们就需要开始分析活动实例,在许可状态(Running)下,分析活动类型:
<A>、普通
普通类型是指在工作流过程中,各个活动(人工活动或自动活动)相互之间路径没有分支,只有单一的流向,此种类型属于普通活动。如图所示:
此种情况下直接读取活动变迁表的后续活动的字段信息。
<B>、路由
路由类型是指在工作流过程中,活动相互之间的路径变迁有多种(大于1)分支,此种情况属于路由类型。路由分几种情况:分裂、汇聚、循环
第一开始活动执行完成后,根据迁移条件是否开始激活运行下一步活动实 例,活动实例在过程实例创建时候已经全部创建完成,此处只要执行激活 运行活动实例,激活运行活动实例的条件是必须至少一个工作任务被创建 并且满足启动运行的条件,那么此时就需要先创建工作任务项,并且启动 运行工作任务,即工作任务的状态变迁为运行,变更完成后,将活动实例 状态变迁运行。
(4)、业务结束
业务单据及工作流流程的结束。结束方式分:完成(正常流转完成),终止(非正常的结束),中断(因工作流在挂起状态下被发现过程实例超过了它的生存周期,有工作流引擎自动执行过程中断。)
业务和流程的结束,工作流引擎将自动清除过程实例、活动实例、工作任 务记录。运行库中,将过程执行情况、活动执行情况、任务执行情况的记录状态变更为相应的结束状态(注意:当非正常结束时,需要清除未完成的活动和任务记录)。
过程推进是由工作流系统的调度引擎来执行,它是工作流系统完整流转的整体过程描述。