当 jBPM 中的流程分叉成并发路径时,这些路径中的每一个都获得自己的流程变量副本,因此它们彼此隔离运行。
但是当路径再次连接时会发生什么?显然可能存在冲突的更新。上下文是否恢复到分叉之前的状态?我可以选择从单独的轨道复制单个变量吗?
当 jBPM 中的流程分叉成并发路径时,这些路径中的每一个都获得自己的流程变量副本,因此它们彼此隔离运行。
但是当路径再次连接时会发生什么?显然可能存在冲突的更新。上下文是否恢复到分叉之前的状态?我可以选择从单独的轨道复制单个变量吗?
我认为您必须配置任务的任务控制器。access
在某些情况下,以不会导致冲突的方式设置属性就足够了(例如read
,访问第一条路径和read,write
访问第二条路径)。如果不是这种情况,那么您可以实现自己的并使用您的自定义逻辑TaskControllerHandler
实现该方法。void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token)
请参阅:任务控制器。
我尝试了一个小实验:
<fork name="fork1" >
<transition to="right" />
<transition to="left" />
</fork>
<node name="left">
<event type="node-enter">
<script>
<expression >
left="left";
shared = left;
</expression>
<variable name='left' access='write' />
<variable name='shared' access='write' />
</script>
</event>
<transition to="join" />
</node>
<node name="right">
<event type="node-enter">
<script>
<expression >
right="right";
token.parent.processInstance.contextInstance.setVariable("fromRight", "woot!");
shared = right;
</expression>
<variable name='right' access='write' />
<variable name='shared' access='write' />
</script>
</event>
<transition to="join" />
</node>
<join name="join" >
<transition to="done"></transition>
</join>
<end-state name="done"/>
最后,我可以访问三个变量,shared、right 和“fromRight”,这些变量是由脚本针对父对象明确设置的。
共享变量从右分叉获取其值,在左侧所做的更改似乎消失了。
请注意,转换对我来说实际上并不是异步的,整个实验将在一个事务中运行,这些因素可能会影响结果