flowable设置流程回退到指定节点

Flowable是一个轻量级业务流程管理框架,支持BPMN(业务流程模型和符号)标准。在Flowable中实现流程回退到指定节点,可以通过以下几种方式:

1. 使用Boundary Event和Intermediate Throw Event

这种方式适用于在设计流程图时就考虑到了可能的回退情况。

  • Boundary Event: 可以添加一个Boundary Event到指定的任务上,用来捕获一个特定的事件(比如,错误事件),然后通过顺序流连接到一个之前的节点。
  • Intermediate Throw Event: 可以在任务完成后触发一个Intermediate Throw Event,然后通过事件网关(Event Gateway)来决定流程的走向。

2. 使用流程变量和排他网关(Exclusive Gateway)

在流程执行过程中,可以通过设置流程变量来控制流程走向,并利用排他网关来决定流程的分支。

  • 在任务完成前设置一个流程变量,比如backToPreviousNode
  • 在任务后放置一个排他网关,根据流程变量的值来决定流程是否回退。

3. 使用JavaDelegate或表达式

在任务完成监听器(ExecutionListener)中编写自定义逻辑,实现回退。

  • 在任务上添加一个完成监听器。
  • 在监听器中使用Java代码或UEL表达式来控制流程回退。

以下是一个简单的JavaDelegate示例:

java
public class RollbackTaskDelegate implements Ja

回退指定节点任务,可以使用 Flowable 的历史记录查询 API 来获取指定节点的历史任务记录,然后根据这些记录创建个新的流程实例。具体步骤如下: 1. 使用 Flowable 的历史记录查询 API 查询指定节点的历史任务记录,可以使用 `HistoricTaskInstanceQuery` 来实现,例如: ```java List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) .taskDefinitionKey(taskDefinitionKey) .list(); ``` 其中,`processInstanceId` 是要回退流程实例 ID,`taskDefinitionKey` 是要回退到的节点 ID。 2. 根据这些历史任务记录创建个新的流程实例,可以使用 `RuntimeService` 的 `createProcessInstanceBuilder` 方法来实现,例如: ```java ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder() .processDefinitionKey(processDefinitionKey) .businessKey(businessKey) .variables(variables) .transientVariables(transientVariables) .tenantId(tenantId) .processInstanceName(processInstanceName) .overrideProcessDefinitionVersion(true); for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) { processInstanceBuilder = processInstanceBuilder .transientVariable(historicTaskInstance.getTaskDefinitionKey(), historicTaskInstance.getVariables()); } ProcessInstance processInstance = processInstanceBuilder.start(); ``` 其中,`processDefinitionKey` 是流程定义的 key,`businessKey` 是业务主键,`variables` 是流程变量,`transientVariables` 是瞬时变量,`tenantId` 是租户 ID,`processInstanceName` 是流程实例名称,`overrideProcessDefinitionVersion` 用于指定是否覆盖流程定义版本。在循环中,我们将历史任务记录的变量作为瞬时变量添加到新的流程实例中。 3. 如果要继续执行回退后的流程,需要使用 `TaskService` 完成新的任务,例如: ```java List<Task> tasks = taskService.createTaskQuery() .processInstanceId(processInstance.getId()) .list(); for (Task task : tasks) { taskService.complete(task.getId()); } ``` 其中,`processInstance.getId()` 获取新的流程实例 ID,使用 `complete` 方法完成任务。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值