1. 串行的回退
流程图
测试
package com.sw.camundademo;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Author Suaxi
* @Date 2024/8/13 21:27
* @Description
*/
@SpringBootTest
public class FlowRollbackTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("任务回退-串行的回退")
.addClasspathResource("flow/35.任务回退-串行的回退.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startFlow() {
String processId = "Process_15y1ksp:1:f147328e-5977-11ef-8eb4-10ffe00abd05";
runtimeService.startProcessInstanceById(processId);
}
@Test
public void taskRollback() {
String processInstanceId = "076d6028-597c-11ef-98e6-10ffe00abd05";
runtimeService.createProcessInstanceModification(processInstanceId)
//.startBeforeActivity("Activity_0l16yzx") //跳转到指定结点之前
.startAfterActivity("Activity_0l16yzx") //跳转到指定结点之后
.cancelAllForActivity("Activity_0azdt7x") //取消某个指定节点
.execute();
}
}
此处以人事审批节点回退至项目经理审批节点为例,执行回退方法后,历史任务表数据如下
补充:
类别 | 方法 |
---|---|
在活动前启动 | 回退到这个节点 |
startBeforeActivity(String activityId); | |
startBeforeActivity(String activityId, String ancestorActivityInstanceId); | |
在活动后启动 | 通过 startAfterActivity() 方法,跳转到指定节点之后的节点 |
startAfterActivity(String activityId); | |
startAfterActivity(String activityId, String ancestorActivityInstanceId); | |
启动一个过渡 | 通过 startTransition() 方法,在一个指定的序列流上开始执行,当有多个流出的序列流时,此时可以与 startAfterActivity() 方法一起使用 |
startTransition(String activityId); | |
startTransition(String activityId, String ancestorActivityInstanceId); | |
取消活动实例 | 通过 cancelActivityInstance() 方法取消指定的活动实例 |
cancelActivityInstance(String activityInstanceId); | |
取消过渡实例 | 过渡实例表示即将以异步延续的形式进入/离开一个活动的执行流,一个已经创建但尚未执行的异步延续Job被表示为一个过渡实例,可以通过 cancelTransitionInstance() 方法来操作 |
cancelTransitionInstance(String transitionInstanceId); | |
取消指定活动的所有活动实例 | 通过 cancelAllForActivity() 方法操作 |
cancelAllForActivity(String activityId); |
2. 并行的回退
流程图
测试
package com.sw.camundademo;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Author Suaxi
* @Date 2024/8/13 21:27
* @Description
*/
@SpringBootTest
public class FlowRollbackTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("任务回退-并行的回退")
.addClasspathResource("flow/36.任务回退-并行的回退.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startFlow() {
String processId = "Process_08oudkn:1:61e0cbaf-5a45-11ef-a08c-10ffe00abd05";
runtimeService.startProcessInstanceById(processId);
}
@Test
public void taskRollback() {
//例一:从技术总监审批、人事审批回退到组长审批
//String processInstanceId = "765f3a01-5a45-11ef-b89b-10ffe00abd05";
//runtimeService.createProcessInstanceModification(processInstanceId)
// .startAfterActivity("StartEvent_1")
// .cancelAllForActivity("Activity_04lzlma")
// .cancelAllForActivity("Activity_1cy7zrd")
// .execute();
//例二:从总经理审批回退到技术总监审批、人事审批
String processInstanceId = "f3d6dd13-5a46-11ef-9eef-10ffe00abd05";
runtimeService.createProcessInstanceModification(processInstanceId)
.startAfterActivity("Activity_1u47ggy")
.startBeforeActivity("Activity_1cy7zrd")
.cancelAllForActivity("Activity_1vpmtcx")
.execute();
}
}
例一历史流程实例表数据
例二历史流程实例表数据
3. 排他网关的回退
流程图
测试
此处以项目经理审批回退到排他网关之前,并让流程重新走到人事审批为例
package com.sw.camundademo;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Author Suaxi
* @Date 2024/8/13 21:27
* @Description
*/
@SpringBootTest
public class FlowRollbackTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("任务回退-排他网关的回退")
.addClasspathResource("flow/37.任务回退-排他网关的回退.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startFlow() {
String processId = "Process_1we1amp:1:3b817685-5a48-11ef-b838-10ffe00abd05";
runtimeService.startProcessInstanceById(processId);
}
@Test
public void taskRollback() {
String processInstanceId = "4b4fc9b1-5a48-11ef-90d7-10ffe00abd05";
runtimeService.createProcessInstanceModification(processInstanceId)
.startBeforeActivity("Gateway_0v6gm4b")
.setVariable("day", 5)
.cancelAllForActivity("Activity_13amaw8")
.execute();
}
}
历史流程实例表数据
4. 子流程的回退
流程图
测试
package com.sw.camundademo;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Author Suaxi
* @Date 2024/8/13 21:27
* @Description
*/
@SpringBootTest
public class FlowRollbackTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("任务回退-子流程的回退")
.addClasspathResource("flow/38.任务回退-子流程的回退.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startFlow() {
String processId = "Process_0unlfrp:1:ff5ff077-5b0b-11ef-9419-10ffe00abd05";
runtimeService.startProcessInstanceById(processId);
}
@Test
public void taskRollback() {
//例一:子任务-项目经理审批回退至组长审批
//String processInstanceId = "31f21b1b-5b0c-11ef-990e-10ffe00abd05";
//runtimeService.createProcessInstanceModification(processInstanceId)
// .startBeforeActivity("Activity_0jscehr")
// .cancelAllForActivity("Activity_0uodo09")
// .execute();
//例二:人事审批回退至子任务-项目经理审批
String processInstanceId = "31f21b1b-5b0c-11ef-990e-10ffe00abd05";
runtimeService.createProcessInstanceModification(processInstanceId)
.startBeforeActivity("Activity_093vft3")
.cancelAllForActivity("Activity_1bf56np")
.execute();
}
}
5. 重启/恢复实例
流程实例终止后,其历史数据仍然存在,并且可以访问,且可以重启该历史流程实例(前提是历史级别设置为 FULL)。例:
- 当执行中的流程实例没有以期望的方式结束时,此时可以使用重启流程实例的方法
- 恢复被错误地取消的流程实例到最后的状态
- 由于错误路由导致流程实例被终止后重启
重启流程实例API runtimeService.restartProcessInstances()
流程图
测试
package com.sw.camundademo;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Author Suaxi
* @Date 2024/8/13 21:27
* @Description
*/
@SpringBootTest
public class FlowRollbackTest {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Test
public void deploy() {
Deployment deploy = repositoryService.createDeployment()
.name("任务回退-重启、恢复流程实例")
.addClasspathResource("flow/39.任务回退-重启、恢复流程实例.bpmn")
.deploy();
System.out.println(deploy.getId());
}
@Test
public void startFlow() {
String processId = "Process_0f17ijs:1:30fc859e-5b0e-11ef-97d6-10ffe00abd05";
runtimeService.startProcessInstanceById(processId);
}
@Test
public void deleteProcessInstance() {
//流程启动后,执行到组长审批、项目经理审批时,删除该流程实例,模拟流程执行过程中的异常中断
String processInstanceId = "400eb4ef-5b0e-11ef-8abb-10ffe00abd05";
runtimeService.deleteProcessInstance(processInstanceId, "deleted");
}
@Test
public void recoveryProcessInstance() {
//恢复流程实例至组长审批、项目经理审批
String processDefinitionId = "Process_0f17ijs:1:30fc859e-5b0e-11ef-97d6-10ffe00abd05";
runtimeService.restartProcessInstances(processDefinitionId)
.startBeforeActivity("Activity_1590vkg")
.startBeforeActivity("Activity_14mdtr0")
.processInstanceIds("400eb4ef-5b0e-11ef-8abb-10ffe00abd05")
.execute();
}
}
注:恢复后的流程实例从用户角度来说中断前是什么样,恢复后也是什么样;但从系统层面来说,恢复后的流程实例是一个全新的数据(流程实例id已经不同)
此处可以参考历史流程实例表数据
评论 (0)