1.概述
BPMN没有一个版本的概念。这样的确是好的,因为可执行的BPMN流程文件会存活在系统知识库版本控制中,作为你开发的工程的一部分。流程定义的版本通过部署来创建。通过部署,Activiti会给ProcessDefinition签名一个版本,在保存到ActivitiDB之前。
对于在业务归档中的每一个流程定义会执行下面的步骤来初始化一个key,version,name和id:
xml文件中的流程定义的id属性是被用于作为流程定义的key属性。
xml文件中的流程定义的name属性是被用于作为流程定义的name属性。如果name属性没有被指定,那么id属性被作为name属性。
一个有特殊key的流程第一次被部署,版本号为1。对于拥有同样key的流程定义,所有之后被部署的,版本号会递增1。key属性被用于区分不同的流程定义。
id属性被设置成 {processDefinitionKey}:{processDefinitionVersion}:{generated-id},在一个集群环境中的流程定义缓存中,这里的generated-id是一个唯一的数字,为了保证流程id的唯一性。
当部署这个流程定义的时候,在数据库中流程定义看起来会是这样:
Table 6.1.
idkeynameversion
myProcess:1:676
|
myProcess
|
My important process
|
1
|
假设我们现在部署了一个同样流程的升级版本,但是流程定义的id属性保持不变。流程定义的表现在变成这样:
Table 6.2.
idkeynameversion
myProcess:1:676
|
myProcess
|
My important process
|
1
|
myProcess:2:870
|
myProcess
|
My important process
|
2
|
当 runtimeService.startProcessInstanceByKey("myProcess")调用的时候,它会用版本2的流程定义作为流程定义的最新版本。
当我们创建第二个流程作为下面定义的并且发布到Activiti,表中会多添加一行。
...
现在的表会是这样:
Table 6.3.
idkeynameversion
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与我们第一个流程的key是不同的。即使名字相同,Activiti在区分流程的时候,只考虑id属性。前面的新流程会被部署为版本1。
2.流程启动
启动流程可以通过流程ID,也可以通过流程的key
如果通过key来启动,比如
runtimeService.startProcessInstanceByKey("test1", "b2KEY", variableMap);
其中“b2KEY”是流程实例的businessKey值
如果同一个流程KEY用同一个businessKey来启动就会报错com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'test1:3:604-b2KEY' for key 'ACT_UNIQ_HI_BUS_KEY'。
activiti不允许同一个流程使用相同的businessKey值,这在实际应用中有会出现一些问题,如同一个业务数据的ID不能使用同一个流程2次。
参考文献
http://cyzgbw.iteye.com/blog/1520949
阅读(12440) | 评论(0) | 转发(0) |