camunda引入了活动实例和活动实例树的概念,这篇文章目的是分析引擎内部,描述实例行为的实现.
为什么我们需要一个活动的实例树?
流程实例树中的每个活动实例都包含有一个节点,有些活动实例是有范围的(如嵌入式子流程) 。这种范围的活动实例可能包含有子实例:
流程实例树及范围
到目前为止,一切都很好。但是不是由流程引擎来执行实例树呢?在一定程度上是的,但不是在所有情况下。有众多的情况下,树的执行并没有按照BPMN 2.0的规范来 。
作用域与并发
流程引擎为作用域和并发提供了“子执行(child execution)”的概念。如果一个非并发(non-concurrent)执行到达并行网关,它会呆在那里,为每个顺序流催生出并发子执行(concurrent child executions )。其效果是,子执行将会嵌套在并行网关(fork)分叉处的一个非活动执行下。这个概念是一个内部的实现细节,而不是BPMN 2.0规范,流程初学者一般很难理解.
在执行树(左边) ,你会看到一个无效的范围执行(inactive scope execution)在并行网关处等待(即使流程实例已经完成,活动任务正在执行服务任务(service task)) 。正在执行服务任务(service task)的执行(executions)嵌套属于等待于并行网关fork(分叉)处的无效范围执行(inactive scope execution )。在活动实例树(右侧) ,无效范围执行是不可见的。
在活动实例树,根节点代表流程实例本身(即流程定义节点(process)的实例)并且其子实例表示为正在进行的服务任务活动实