场景:flowable 正常使用的时候,每一版本的流程都是根据该版本的流程图进行执行的。然后 总有些不走寻常路的需求,比如:旧版本数据兼容新版本流程图。本章主要是对如何让旧流程兼容新流程的一种方法的描述
环境:
springboot:2.2.0.RELEASE
flowable:6.4.2
流程图示例场景:
旧流程图
新流程图
操作:希望旧流程图的待办数据可以按照新流程图进行执行。
实现思路分析:
调用完成任务的时候,会在内存初始化流程图,然后根据任务信息,找到对应流程图的那个指定节点,再按照流程图的线条继续往下执行。
从获取流程定义 bpmnXML 的 源码中可以发现,围绕几个核心类:
org.flowable.engine.impl.cmd.GetBpmnModelCmd
org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntityImpl
org.flowable.engine.impl.persistence.entity.DeploymentEntityImpl
org.flowable.engine.impl.persistence.entity.ResourceEntityImpl
根据上面的类,可以找到基本围绕下面这几张表
获取流程BpmnXML的方法
@Test
public void getBpmnXml(){
String processDefinitionId = "test-0901-2:1:8";
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
byte[] bytes = modelService.getBpmnXML(bpmnModel);
System.out.println();
System.out.println(new String(bytes));
}
表关系
数据关系图
获取Bpmn数据
ACT_GE_BYTEARRAY
ResourceEntityImpl
调用基本Api (flowable 底层中util需要在 org.flowable.common.engine.impl.interceptor.Command 作用域下才有效 )
ProcessDefinitionEntity newProcessDefinitionEntity = CommandContextUtil.getProcessDefinitionEntityManager().findById(newProcessDefinitionId);
ResourceEntityManager resourceEntityManager = CommandContextUtil.getResourceEntityManager();
// 获取流
ResourceEntity newResourceEntity = resourceEntityManager
.findResourcesByDeploymentId(newProcessDefinitionEntity.getDeploymentId())
.stream()
.filter(ResourceEntity::isGenerated)
.collect(Collectors.toList()).get(0);
在上面获取到流程图的xml,需要对把新流程图的 ID 替换回旧流程的,再插入到数据库,从源码中可以找到2个工具类 :
org.flowable.bpmn.converter.BpmnXMLConverter
org.flowable.editor.language.json.converter.BpmnJsonConverter
通过这2个工具类就可以把流程图 在 BpmnModel 和 xml 中切换。
替换资源代码
InputStream newInputStream = new ByteArrayInputStream(newResourceEntity.getBytes());
BpmnModel newBpmnModel = bpmnXMLConverter.convertToBpmnModel(new InputStreamSource(newInputStream), true, true);
InputStream oldInputStream = new ByteArrayInputStream(oldResourceEntity.getBytes());
BpmnModel oldBpmnModel = bpmnXMLConverter.convertToBpmnM