Workflow jBPM、并发执行和流程变量

Workflow jBPM、并发执行和流程变量,workflow,business-process-management,jbpm,Workflow,Business Process Management,Jbpm,当jBPM中的一个进程分叉到并发路径时,这些路径中的每一个都会获得自己的进程变量副本,以便它们彼此独立运行 但是当路径再次连接时会发生什么呢? 显然,可能会有冲突的更新。 上下文是否恢复到fork之前的状态? 我可以选择从单独的轨道复制单个变量吗?我认为您必须配置任务的任务控制器。在某些情况下,以不会导致冲突的方式设置access属性就足够了(例如read访问第一条路径和read,write访问第二条路径)。如果情况并非如此,则可以使用自定义逻辑实现自己的TaskControllerHandle

当jBPM中的一个进程分叉到并发路径时,这些路径中的每一个都会获得自己的进程变量副本,以便它们彼此独立运行

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

我认为您必须配置任务的任务控制器。在某些情况下,以不会导致冲突的方式设置
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"/>

left=“left”;
共享=左;
right=“right”;
token.parent.processInstance.contextInstance.setVariable(“fromRight”,“woot!”);
分享=权利;
最后,我访问了三个变量,shared、right和“fromRight”,这三个变量是脚本针对父对象显式设置的

共享变量从右叉获取其值,在左叉所做的更改似乎消失了


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

我认为这是正确的答案。使用jBPM您可以编写一个“工作流程序”,它必须解决自己独特的问题,因为没有一个通用的变量同步是完美的。因为这是在一个线程中运行的(可能是?),所以实际发生的情况是,左分支的更改(先运行)被右分支的更改覆盖。