1、流程定义的版本控制
从本质上讲,业务流程是长期运行的,流程实例可能会持续数周或数月。同时,流程实例的状态将存储到数据库中。但是,即使仍有正在运行的实例,您也可能需要更改流程定义。
流程引擎支持此功能:
- 如果重新部署更改的流程定义,则会在数据库中获得新版本。
- 正在运行的流程实例将继续在启动它们的版本中运行。
- 新的流程实例将在新版本中运行 - 除非显式指定。
- 在特定限制内支持将流程实例迁移到新版本。
您可以在流程定义表中看到不同的版本,并且流程实例链接到以下版本:
2、流程定义KEY与 ID
Key:Key是XML中流程定义的唯一标识符,因此它的值是从XML中的id属性中读取,本示例的流程key为:Process_15r7d3m
<bpmn:process id="Process_15r7d3m" name="UserTask Flow1" isExecutable="true" camunda:historyTimeToLive="180">
Id:Id是数据库act_re_procdef表的主键,通常由流程定义key、版本和自动生成Id组合而成,格式为:流程定义key:版本:自动生成Id。流程定义模型存储在act_re_procdef表里:
3、使用流程哪个版本
启动流程实例时可以按流程模板的key或者按id启动。
- 按Key:它使用键启动最新部署的流程定义版本的实例。
- 按 id:它使用数据库 ID 启动已部署流程定义的实例。通过使用它,您可以启动特定版本。
默认和推荐的用法是使用startProcessInstanceByKey并始终使用最新版本:
processEngine.getRuntimeService().startProcessInstanceByKey("invoice");// will use the latest version (2 in our example)
如果要专门启动旧流程定义的实例,请使用流程定义查询查找正确的ProcessDefinition的id,然后使用startProcessInstanceById:
ProcessDefinition pd = processEngine.getRepositoryService().createProcessDefinitionQuery()
.processDefinitionKey("invoice")
.processDefinitionVersion(1).singleResult();
processEngine.getRuntimeService().startProcessInstanceById(pd.getId());
使用BPMN调用子流程 CallActivities 时,您可以配置使用的版本:
<callActivity id="callSubProcess" calledElement="checkCreditProcess"
camunda:calledElementBinding="latest|deployment|version"
camunda:calledElementVersion="17"></callActivity>
或
<callActivity id="callSubProcess" calledElement="checkCreditProcess"
camunda:calledElementBinding="versionTag"
camunda:calledElementVersionTag="ver-tag-1.0.1"></callActivity>
选项有
- latest:使用最新版本的流程定义(与startProcessInstanceByKey一样)。
- deployment:使用与调用流程版本匹配的版本中的流程定义。如果它们部署在一个部署中,则这有效 - 因为它们总是一起进行版本控制。
- version:指定在 XML 中硬编码的版本。
- versionTag:指定versionTag在XML中硬编码的 。
4、版本标签如何使用
可以使用版本标签属性标记流程定义。这可以通过将 camunda:versionTag 扩展属性添加到流程中来完成:
<bpmn2:process camunda:versionTag="1.5-patch2" ..
现在将提供一个 versionTag 字段,您可以获取该字段:ProcessDefinition
ProcessDefinition pd = processEngine.getRepositoryService().createProcessDefinitionQuery()
.processDefinitionKey("invoice")
.processDefinitionVersion(1).singleResult();
pd.getVersionTag();
或者获取包含指定版本的所有已部署流程定义的列表:
List<ProcessDefinition> pdList = processEngine.getRepositoryService().createProcessDefinitionQuery()
.versionTag("1.5-patch2")
.list();
您还可以使用查询一系列版本:versionTagLike
List<ProcessDefinition> pdList = processEngine.getRepositoryService().createProcessDefinitionQuery()
.versionTagLike("1.5-%")
.list();
下面的示例演示如何启动最新流程的流程实例 版本标记的定义:
ProcessDefinition pd = processEngine.getRepositoryService().createProcessDefinitionQuery()
.processDefinitionKey("invoice")
.versionTag("1.5-patch2")
.orderByVersion().
.desc()
.listPage(0,1);
processEngine.getRuntimeService().startProcessInstanceById(pd.getId());