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()); 
                


















