场景
我们在进行流程按阶段开发时会遇到一个情况,例如:
一个很长的流程,但是是分段式开发的,A、B、C三个流程是一个流程,但是在开发的时候由于流程太长,时间周期只能先做一部分让客户进行使用,所以将流程拆成三段式开发,那么在我们开发完A流程的时候在A流程的基础上追加B流程,这个时候A流程已经在线上运行了一段时间了,也有很多的数据了,那么在B流程开发完成以后需要把A流程上的数据都迁移至A、B流程迭代的版本上来。
A流程
A、B迭代版本
解决方案
在flowable 6.5以后提供了一个Api服务类ProcessMigrationService,可通过他来进行流程实例的迁移工作。
通过 processMigrationService 可以使用如下的 API:
public ProcessInstanceMigrationBuilder createProcessInstanceMigrationBuilder() {
return new ProcessInstanceMigrationBuilderImpl(this);
}
public ProcessInstanceMigrationBuilder createProcessInstanceMigrationBuilderFromProcessInstanceMigrationDocument(ProcessInstanceMigrationDocument document) {
return this.createProcessInstanceMigrationBuilder().fromProcessInstanceMigrationDocument(document);
}
public ProcessInstanceMigrationValidationResult validateMigrationForProcessInstance(String processInstanceId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
return (ProcessInstanceMigrationValidationResult)this.commandExecutor.execute(new ProcessInstanceMigrationValidationCmd(processInstanceId, processInstanceMigrationDocument));
}
public ProcessInstanceMigrationValidationResult validateMigrationForProcessInstancesOfProcessDefinition(String processDefinitionId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
return (ProcessInstanceMigrationValidationResult)this.commandExecutor.execute(new ProcessInstanceMigrationValidationCmd(processInstanceMigrationDocument, processDefinitionId));
}
public ProcessInstanceMigrationValidationResult validateMigrationForProcessInstancesOfProcessDefinition(String processDefinitionKey, int processDefinitionVersion, String processDefinitionTenantId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
return (ProcessInstanceMigrationValidationResult)this.commandExecutor.execute(new ProcessInstanceMigrationValidationCmd(processDefinitionKey, processDefinitionVersion, processDefinitionTenantId, processInstanceMigrationDocument));
}
public void migrateProcessInstance(String processInstanceId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
this.commandExecutor.execute(new ProcessInstanceMigrationCmd(processInstanceId, processInstanceMigrationDocument));
}
public void migrateProcessInstancesOfProcessDefinition(String processDefinitionId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
this.commandExecutor.execute(new ProcessInstanceMigrationCmd(processInstanceMigrationDocument, processDefinitionId));
}
public void migrateProcessInstancesOfProcessDefinition(String processDefinitionKey, int processDefinitionVersion, String processDefinitionTenantId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
this.commandExecutor.execute(new ProcessInstanceMigrationCmd(processDefinitionKey, processDefinitionVersion, processDefinitionTenantId, processInstanceMigrationDocument));
}
public Batch batchMigrateProcessInstancesOfProcessDefinition(String processDefinitionId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
return (Batch)this.commandExecutor.execute(new ProcessInstanceMigrationBatchCmd(processDefinitionId, processInstanceMigrationDocument));
}
public Batch batchMigrateProcessInstancesOfProcessDefinition(String processDefinitionKey, int processDefinitionVersion, String processDefinitionTenantId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
return (Batch)this.commandExecutor.execute(new ProcessInstanceMigrationBatchCmd(processDefinitionKey, processDefinitionVersion, processDefinitionTenantId, processInstanceMigrationDocument));
}
public ProcessInstanceBatchMigrationResult getResultsOfBatchProcessInstanceMigration(String migrationBatchId) {
return (ProcessInstanceBatchMigrationResult)this.commandExecutor.execute(new GetProcessInstanceMigrationBatchResultCmd(migrationBatchId));
}
使用迁移的方法
首先我们需要使用他提供的迁移验证方法,加一道保险,毕竟该流程对线上数据存在影响
// 迁移验证
boolean migrationValid = processMigrationService.createProcessInstanceMigrationBuilder()
.migrateToProcessDefinition(toProcessDefId) // 原流程id
.validateMigrationOfProcessInstances(fromProcessDefId) //需要迁移到的流程id
.isMigrationValid();
如果 migrationValid 等于false说明flowable自带的验证没通过,就可以自行做一些业务处理。
如果验证通过,就可以调用执行迁移的方法:
// 验证通过执行迁移
processMigrationService.createProcessInstanceMigrationBuilder()
.migrateToProcessDefinition(toProcessDefId)
.migrateProcessInstances(fromProcessDefId);
完整代码:
public void procInstMigration(String fromProcessDefId, String toProcessDefId) throws Exception {
// 迁移验证
boolean migrationValid = processMigrationService.createProcessInstanceMigrationBuilder()
.migrateToProcessDefinition(toProcessDefId)
.validateMigrationOfProcessInstances(fromProcessDefId)
.isMigrationValid();
if (!migrationValid) {
// 验证不通过
throw new Exception("流程定义差异过大不满足在途流程的迁移,请修改流程图");
}
// 验证通过执行迁移
processMigrationService.createProcessInstanceMigrationBuilder()
.migrateToProcessDefinition(toProcessDefId)
.migrateProcessInstances(fromProcessDefId);
}
注意:旧版流程已经结束,该方法不会处理