camunda引入了活动实例和活动实例树的概念。 这篇文章的目的是分析引擎内部,描述实例动作的实现。
为什么需要活动的实例树?
流程实例树中的每个活动实例都包含一个节点,而一些活动实例具有内置子流程等范围。 此范围内的活动实例可能包含子实例。
进程的实例树和范围
到目前为止,一切都很好。 但是流程引擎不是运行实例树吗? 在某种程度上是这样,但不是所有情况。 在许多情况下,树的执行不符合BPMN 2.0的规范。
与范围同时运行
流程引擎为范围和并发提供了“子执行”的概念。 到达并行网关的非并发(non-concurrent )运行将停留在那里,并促使每个顺序流并发(concurrent child executions )。 因此,子执行嵌套在并行网关(fork )分支中的非活动执行下。 这个概念是内部实现的细节,不是BPMN 2.0规范,流程的初学者一般难以理解。
在运行树(左)中,“无效的范围运行”(inactive scope execution )正在并行网关上等待(流程实例已完成,活动任务为服务任务) 运行服务任务的(运行服务任务)执行嵌套属于并行网关fork (运行禁用范围) inactive scope execution。 活动实例树(右侧)不显示无效范围的执行。
在活动实例树中,根节点表示流程实例本身,即流程定义节点(process )的实例,其子实例表示正在进行的服务任务活动实例。
另一个例子是并行多实例。 请参考以下示例。
1 )单个并发多实例任务:
2 )多个实例的子流:
在左图中,流程引擎基于内部流程定义等因素生成其他运行。 在流程中,我们希望将活动实例树更形象化,便于理解,并符合BPMN 2.0标准。
执行树压缩和优化
引入活动实例树的第二个原因是在运行流程引擎时压缩和优化运行树。 假设一个并行网关有两个用户任务。 一开始T1和T2都在活动。 在运行树中,每个任务之一是并行网关上正在等待无效的并行根运行。 活动实例树具有相同的结构,但与根节点对应的流程实例本身并不在并行网关上等待。 当T2完成任务时,流程引擎执行树将被压缩,T1的执行将被删除,并被根执行所替换。 如果执行T1引用了变量或任务,它们将移动到根执行。 活动树看起来包含T1的活动实例和流程定义本身。
压缩执行树
这种行为(behavior )的派生在执行树种中不存在“节点实例标识符”(activity instance identity )的概念。 没有描述一个节点实例的唯一标识符。 一般来说,不能保证同一输入节点实例的运行完全一致地完成。 例如,在上面的示例中T1以执行ID=2开始并且以执行ID=1结束。
注:节点实例是活动实例。 这里翻译为节点。 更容易理解。
(顺便说一下,因为是:所以一般不应该使用与消息相关的执行的id(executionids ) )
在流过程中,我们希望用户能够选择节点实例并显示详细信息,如: (变量,任务)。 如果使用执行ids (执行ids ),则在用户查看详细信息时选择T1,URL中可能会写有执行id (执行id )。 此时,T2已完成,执行树已被进程引擎压缩。 用户现在将更新浏览器。 即使当前任务处于活动状态,也会由于以前选择的执行ID不存在而发生错误。 哎呀,人类真的失败了!
糟糕的是,他可能把这个错误的网址发给了更多的同事。 )
历史与执行相统一的模式
流程引擎添加活动实例树的第三个原因是它适用于工作流引擎历史记录的工作。 工作流引擎的历史总是需要历史活动实例这一概念。 将历史记录与执行树相关联后,可以使用相同的客户端代码更形象地表示历史记录活动的实例和活动。 另外,即使历史封闭,流转过程也同样适用。
事件树是如何实现的
将事件实例树推入执行树种。 将“act _ inst _ id _”:列添加到执行数据表
新列ACT_INST_ID_已添加到执行数据表中
除了更改数据库以外,什么都不需要更改。 所有其他列的值保持不变,执行次数与以前相同。
活动实例IDs由AtoMic Operations生成,如:开始/结束活动:
在本例中,活动实例ID的生成和活动(开始/结束侦听器)调用按计划工作。活动实例ID的生成比活动start侦听启动得早。
如何获取活动实例树?
当前,要检索活动实例树,只能使用整个流程实例。
使用JAVA API:
activityinstancerootactivityinstance=runtimeservice.getactivityinstance (pi.getprocessinstance id );
也可以使用rest api
接下来,开始支持对查询(如事件实例)的公共API。
executions确实会被废弃不能使用吗?
不知道,但我的直觉是确实的。 “运行”概念需要关注自己的流程内部引擎,活动实例模式逐渐被替换。 这可能是我们接下来要走的路。 虽然您仍然可以执行查询,但实际上结果是活动实例而不是执行实例