flowable并行任务回退
时间: 2023-12-09 17:36:19 浏览: 419
并行任务回退是指在流程中存在多个并行分支时,某个分支中的任务需要回退到之前的节点,而不影响其他分支的正常流转。下面是实现并行任务回退的方法:
1.对于同一条分支内部的任务回退,只需要将该分支中的任务节点依次回退即可,不会影响其他分支的正常流转。
2.对于不同分支之间的任务回退,需要将回退操作同步到同级分支中,即同级分支中的任务节点也需要回退。如果回退到上一级分支,则同级分支也需要回退。
3.对于并行分支节点的后续节点退回至并行分支节点,只需要将任务节点退回至指定节点即可,其余分支不受影响。
需要注意的是,为了实现并行任务回退,需要对业务逻辑进行抽象归纳,并采用分层架构,以便满足层层式退回的需求。
相关问题
flowable 并行网关多分支如何拒绝审批并回退
<think>嗯,用户想知道在Flowable中如何实现并行网关多分支审批被拒绝后的回退机制。首先,我需要回忆一下Flowable的基本处理流程。Flowable支持并行网关,但默认的回退功能可能不够,特别是并行流程的处理比较复杂。根据提供的引用,Flowable本身只能处理串行流程的回退,而并行流程需要额外的逻辑。
用户提到的是多分支审批被拒绝后的回退,这可能涉及到并行网关中的多个分支同时或部分回退的情况。引用[2]中提到,他们通过增加leaf值来标记节点的层级,从而实现不同分支的回退控制。比如,当某个节点需要回退到上一级时,同级分支可能需要同步回退,而上级节点不受影响。例如,节点4退回到2时,节点6也要退回,但节点8保持不变。
接下来,我需要考虑如何具体实现这一点。可能需要通过任务监听器或执行监听器来捕获回退事件,然后动态调整流程的路径。此外,可能需要修改流程定义中的节点属性,比如添加扩展属性来记录节点的层级关系,这样在回退时可以根据这些属性判断哪些节点需要一起回退。
另外,引用[2]中的例子显示,当任务从节点9退回到4时,只需要处理当前分支,不影响其他分支。这可能需要动态生成目标节点,并处理令牌的移动,可能需要使用Flowable的API如RuntimeService.createChangeActivityStateBuilder()来调整流程实例的状态。
不过,用户可能需要具体的步骤或代码示例。比如,如何添加leaf值,如何在回退时检查这些值,以及如何调用API来移动流程节点。同时,需要处理并行网关的同步问题,确保流程不会出现不一致的状态。
可能还需要考虑边界情况,比如部分分支已经完成审批,而其他分支被拒绝,这时候如何只回退被拒绝的分支。或者当回退到某个节点后,重新审批时如何合并流程继续执行。
总结下来,实现并行网关多分支回退的关键点包括:标记节点层级、监听回退事件、动态调整流程路径、处理同步问题。需要结合Flowable提供的API和自定义逻辑来实现这些功能。</think>在Flowable工作流引擎中实现并行网关多分支审批拒绝后的回退,需要结合自定义逻辑和引擎特性。以下是具体实现方案:
### 一、核心实现原理
1. **令牌(Token)控制**:通过动态调整流程实例的`execution`令牌位置实现回退[^2]
2. **层级标记**:使用自定义属性`leaf`标记节点层级关系
```xml
<userTask id="task4" flowable:leaf="2"/>
<userTask id="task8" flowable:leaf="1"/>
```
3. **路径追踪**:通过历史记录判断分支归属关系
### 二、具体实现步骤
1. **拦截退回事件**:使用任务监听器捕获拒绝操作
```java
taskService.addTaskListener(TaskListener.EVENTNAME_COMPLETE, new RejectListener());
```
2. **层级关系判断**:根据目标节点的`leaf`值确定影响范围
```java
HistoricActivityInstance currentAct = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(procInstId)
.unfinished()
.singleResult();
```
3. **动态调整流程路径**:通过API修改执行流
```java
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(procInstId)
.moveActivityIdTo(currentAct.getActivityId(), targetActId)
.changeState();
```
### 三、典型场景处理逻辑
1. **分支内部回退**(如节点4→3):
- 仅修改当前分支的令牌位置
- 其他分支保持当前状态
2. **跨层级回退**(如节点4→2):
```java
if(targetLeaf < currentLeaf){
// 找到所有同级分支节点
List<Execution> parallelExecutions = runtimeService.createExecutionQuery()
.parentId(parentExecutionId)
.list();
}
```
3. **完全回退**(如节点4→1):
- 终止所有并行分支
- 重置流程到并行网关入口
```sql
UPDATE ACT_RU_EXECUTION SET ACT_ID_='parallelGateway1'
WHERE PROC_INST_ID_ = #{procInstId}
```
### 四、数据一致性保障
1. **历史记录修复**:
```java
managementService.executeCommand(new DeleteActivityInstanceCmd(
procInstId,
Arrays.asList("task4","task6")
));
```
2. **异步补偿机制**:
```xml
<serviceTask id="compensationTask"
flowable:async="true"
flowable:class="com.example.CompensationHandler"/>
```
flowable 会签任务撤回
根据引用中的描述,撤消是指将流程流转回到之前的节点,使之前的任务被删除。而并行网关中的回退是指将任务回退到流程的起始节点,同时其他并行流转的任务也会自动回退到起始节点。所以,flowable会签任务撤回可以通过将任务回退到起始节点来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [flowable,199boge,进阶](https://blog.csdn.net/aiwokache/article/details/127788938)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文
相关推荐
















