当jBPM中的进程分叉到并发路径时,这些路径中的每一个都会获得自己的进程变量副本,以便它们彼此隔离。
但是当路径再次加入时会发生什么? 显然可能存在冲突的更新。 上下文是否会恢复到fork之前的状态? 我可以选择从单独的轨道中复制单个变量吗?
答案 0 :(得分:2)
我认为您必须配置任务的任务控制器。在某些情况下,以不会导致冲突的方式设置access
属性就足够了(例如read
访问第一条路径并read,write
访问第二条路径)。如果不是这种情况,那么您可以实现自己的TaskControllerHandler
并使用自定义逻辑实现方法void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token)
。请参阅:Task Controllers。
答案 1 :(得分:1)
我尝试了一点实验:
<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”,这是由脚本明确地设置的。
共享变量从右侧分叉获取其值,左侧的变化似乎消失了。
请注意,转换对我来说实际上并不是异步的,并且整个实验将在一个事务中运行,这些因素可能会影响结果