1、前言
实际项目中审批流程会持续好几天甚至好几个月,如果在这个过程中想修改流程定义,那需要考虑的问题就是修改后的流程定义重新部署后是否会影响之前发起的流程实例,而Camunda流程引擎是有版本控制的。
- 如果重新部署已部署的流程定义,将在数据库中获得一个新版本。
- 正在运行的流程实例将继续在它们启动时的版本中运行。
- 新流程实例将在新版本中运行 - 除非明确指定。
- 在一定限度内支持将流程实例迁移到新版本。
这里也可以看出来流程定义id与流程定义才具有一对一关系。
2、使用哪个版本
发起流程实例时:
- By key :它使用密钥启动流程定义的最新部署版本的实例。
- By id:它使用数据库 id 启动已部署流程定义的实例。通过使用它,可以启动特定版本。
默认和推荐的用法是使用startProcessInstanceByKey并始终使用最新版本:
runtimeService.startProcessInstanceByKey("key")
如果想使用指定的某个版本来发起流程实例,需要先查找正确的流程定义id。
ProcessDefinitionprocessDefinition=repositoryService.createProcessDefinitionQuery() .processDefinitionKey("Process_1na7bx4") .processDefinitionVersion(10) .singleResult(); runtimeService.startProcessInstanceById(processDefinition.getId());
web查看时左侧可选择流程定义版本号
3、版本标签
这个东西说实话实际项目中我也没用过。使用版本标记属性标记流程定义。这可以通过向进程添加 camunda:versionTag 扩展属性来完成。
从ProcessDefinition中可以获取
ProcessDefinitionpd=repositoryService.createProcessDefinitionQuery() .processDefinitionKey("invoice") .processDefinitionVersion(1).singleResult(); pd.getVersionTag();
或获取包含指定版本的所有已部署流程定义的列表
List<ProcessDefinition>pdList=repositoryService.createProcessDefinitionQuery() .versionTag("1.5-patch2") .list();
还可以versionTagLike用于查询一系列版本
List<ProcessDefinition>pdList=repositoryService.createProcessDefinitionQuery() .versionTagLike("1.5-%") .list();
以下示例显示如何启动版本标记的最新流程定义的流程实例
ProcessDefinitionpd=repositoryService.createProcessDefinitionQuery() .processDefinitionKey("invoice") .versionTag("1.5-patch2") .orderByVersion(). .desc() .listPage(0,1); runtimeService.startProcessInstanceById(pd.getId());
流程定义version和versionTag是独立的属性。