为什么要流程迁移?
当我们想要去更新一个流程时,只能先发布一个新的版本,而发布的新版本流程不会去影响正在执行的流程,只有新发起的流程才会去走新版本的流程
现在有个需求是要让正在执行的流程按照新流程的逻辑运行,就需要使用camunda的流程迁移了
迁移场景
原流程图
新增节点
流程图
//新增节点代码
String sourceProcessId = "Process_0hnbxpf:3:26f5a597-6f90-11ed-b7f6-d08e790f2b58";//原流程processDefinitionId
String targetProcessId = "Process_0hnbxpf:4:aa5da81c-6fbd-11ed-8ba6-d08e790f2b58";//新流程processDefinitionId
//流程迁移计划
MigrationPlan migrationPlan = runtimeService
.createMigrationPlan(sourceProcessId, targetProcessId)
.mapEqualActivities()
.updateEventTriggers()
.build();
//查询原流程正在执行的流程
List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processDefinitionId(sourceProcessId).active().list();
List<String> processInstanceIds = processInstances.stream().map(e -> e.getProcessInstanceId()).collect(Collectors.toList());
//迁移正在执行的流程
MigrationPlanExecutionBuilder migrationPlanExecutionBuilder = runtimeService.newMigration(migrationPlan).processInstanceIds(processInstanceIds)
.skipCustomListeners()//跳过自定义的监听器
.skipIoMappings();//跳过io映射
migrationPlanExecutionBuilder.execute();
删除节点
流程图
//删除节点代码
String sourceProcessId = "Process_0hnbxpf:3:26f5a597-6f90-11ed-b7f6-d08e790f2b58";//原流程processDefinitionId
String targetProcessId = "Process_0hnbxpf:4:aa5da81c-6fbd-11ed-8ba6-d08e790f2b58";//新流程processDefinitionId
String oldNodeKey = "Activity_B";//删除的节点
String targetNodeKey = "Activity_A";//将oldNodeKey迁移到的目标节点
//流程迁移计划
MigrationPlan migrationPlan = runtimeService
.createMigrationPlan(sourceProcessId, targetProcessId)
.mapActivities(oldNodeKey, targetNodeKey)
.mapEqualActivities()
.updateEventTriggers()
.build();
//查询原流程正在执行的流程
List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processDefinitionId(sourceProcessId).active().list();
List<String> processInstanceIds = processInstances.stream().map(e -> e.getProcessInstanceId()).collect(Collectors.toList());
//迁移正在执行的流程
MigrationPlanExecutionBuilder migrationPlanExecutionBuilder = runtimeService.newMigration(migrationPlan).processInstanceIds(processInstanceIds)
.skipCustomListeners()//跳过自定义的监听器
.skipIoMappings();//跳过io映射
migrationPlanExecutionBuilder.execute();