### 工作流回退常用模式分析
#### 1. 前言
回退功能在国内的工作流系统中是一项非常重要且复杂的功能。虽然许多工作流产品都声称支持回退等功能,但具体支持哪些类型的回退模式却鲜少提及。本文作者胡长城(银狐999)对工作流回退的常用模式进行了深入分析,总结出了多种回退模式,并对这些模式的特点及应用场景进行了详细阐述。
#### 2. 简单退回
简单退回是最基础的一种回退形式,它主要涉及将任务或工作项(Workitem)退回给前一个处理者。这一模式看似简单,但在实际应用中需要注意以下几点:
- **回退对象**:回退给上一个活动的最后执行者还是所有执行者?
- **当前活动处理**:如果当前活动有多个工作项在同时处理,回退时是否需要全部终止?
在实际操作中,通常采取一种统一的处理原则,例如将任务回退给上一个活动的所有执行者,并在回退时终止所有其他正在进行的工作项。
#### 2.1. 退回到前活动
- **定义**:将任务退回到前一个处理者手中。
- **特点**:
- 回退给上一个活动的最后执行者或所有执行者。
- 如果当前活动包含多个工作项,需要决定是终止所有还是仅终止当前的工作项。
#### 2.2. 退回跨越几个活动
- **定义**:适用于串行路由场景,回退后所有活动需要重新执行。
- **特点**:
- 回退跨越多个活动节点。
- 所有受影响的活动都需要重新执行。
#### 3. 分支到主支的回退
当工作流包含分支时,回退可能涉及到分支与主支之间的切换。这类回退需要更精细的设计和控制。
##### 3.1. 直来直去方式
- **定义**:回退后,被回退的任务处理完毕后直接返回给当前活动的处理人。
- **特点**:
- 回退发生在活动之间,而非工作项之间。
- 回退后的处理路径直接返回到当前活动。
##### 3.2. 原始路由重新走
- **定义**:回退后,按照原执行路径重新执行。
- **特点**:
- 黄色的E点活动不受影响,仍在执行。
- 回退路径遵循原始执行路径。
##### 3.3. 强制退回,撤销其他活动
- **定义**:回退时,将分支范围内其他正在进行的活动终止。
- **特点**:
- 终止分支范围内其他活动。
- 路由重新计算和执行。
- 可能导致某些原本可达的分支变得不可达。
##### 3.4. 退回,不改变现有活动
- **定义**:回退时不改变分支范围内其他正在进行的活动状态。
- **特点**:
- E活动点仍在执行,并可继续向下执行。
- 处理起来较为复杂,可能导致流程死锁等问题。
- 需要有特殊机制处理此类情况。
##### 3.5. 块限制
- **定义**:通过引入块(Block)的概念来限制回退行为,确保回退行为限制在同一级别的分支内。
- **特点**:
- F点活动的回退范围仅限于B点所在的分支内。
- 有助于避免跨分支的复杂回退路径带来的问题。
#### 4. 主支到分支的回退
当工作流从主支转向分支时,也会出现相应的回退需求。
##### 4.1. 直来直去方式
- **定义**:回退后,任务处理完毕直接返回给当前活动的处理人。
- **特点**:
- 回退路径直接返回到当前活动。
##### 4.2. 原始路由重走
- **定义**:回退后,按照原始执行路径重新执行。
- **特点**:
- 回退路径遵循原始执行路径。
##### 4.3. 块限制
- **定义**:通过引入块(Block)的概念来限制回退行为,确保回退行为限制在同一级别的分支内。
- **特点**:
- 限制回退行为在同一级别的分支内,避免跨分支的复杂回退路径带来的问题。
### 总结
工作流回退是一种复杂但重要的功能,通过对不同回退模式的理解和选择,可以更好地满足实际业务需求。以上提到的各种模式各有特点,适用于不同的场景。在设计和实施工作流系统时,应根据具体的应用场景选择合适的回退策略,以提高系统的灵活性和效率。