BPMN 中并没有版本的概念,没有版本也是不错的,因为可执行的 BPMN 流程作为你开发项目的一部分存在版本控制系统的知识库中(例如 SVN,Git 或者 Mercurial )。 而在 Activiti 中,流程定义的版本是在部署时创建的。在部署的时候,流程定义被存储到 Activiti 使用的数据 库之前,Activiti 将会自动给 流程定义 分配一个版本号。
对于业务文档中每一个的流程定义,都会通过下列部署执行初始化属性 key, version, name 和 id:
看下面示例
<definitions id="myDefinitions" >
<process id="myProcess" name="My important process" >
...
当部署了这个流程定义之后,在数据库中的流程定义看起来像这样:
Table 6.1.
id | key | name | version |
---|---|---|---|
myProcess:1:676 | myProcess | My important process | 1 |
假设我们现在部署用一个流程的最新版本号(例如 改变用户任务),但是流程定义的 id 保持不变。 流程定义表将包含以下列表信息:
Table 6.2.
id | key | name | version |
---|---|---|---|
myProcess:1:676 | myProcess | My important process | 1 |
myProcess:2:870 | myProcess | My important process | 2 |
当 runtimeService.startProcessInstanceByKey("myProcess") 方法被调用时,它将会使用流程定义版本号为2的,因为这是最新版本的流程定义。可以说每次流程定义创建流程实例时,都会默认使用最新版本的流程定义。
我们应该创建第二个流程,在 Activiti 中,如下,定义并且部署它,该流程定义会添加到流程定义表中
<definitions id="myNewDefinitions" >
<process id="myNewProcess" name="My important process" >
...
表格如下:
Table 6.3.
id | key | name | version |
---|---|---|---|
myProcess:1:676 | myProcess | My important process | 1 |
myProcess:2:870 | myProcess | My important process | 2 |
myNewProcess:1:1033 | myNewProcess | My important process | 1 |
注意:为何新流程的 key 与我们的第一个流程是不同的。尽管流程定义的名称是相同的(当然,我们应该也是可以改变这一点的),Activiti 仅仅只考虑 id 属性判断流程。因此,新的流程定义部署的版本号为1。