jBPM,并发执行和流程变量

时间:2020-03-06 14:31:40  来源:igfitidea点击:

当jBPM中的流程派生到并发路径时,这些路径中的每一个都会获得自己的流程变量副本,从而使它们彼此隔离运行。

但是,当路径再次连接时会发生什么呢?
显然可能存在冲突的更新。
上下文会恢复到派生之前的状态吗?
我可以选择从单独的轨道复制单个变量吗?

解决方案

我认为我们必须配置任务的任务控制器。在某些情况下,以不会导致冲突的方式设置"访问"属性就足够了(例如,对第一条路径的"读取"访问权和对第二条路径的"读取,写入"访问权)。如果不是这种情况,那么我们可以使用自定义逻辑来实现自己的TaskControllerHandler并实现方法void void SubmitTaskVariables(TaskInstance taskInstance,ContextInstance contextInstance,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",这三个变量是由脚本针对父级显式设置的。

共享变量的值来自右叉,左侧的更改似乎消失了。

请注意,对于我而言,转换实际上并不是异步的,整个实验将在一个事务中运行,这些因素可能会影响结果