2008-09-22 69 views
2

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

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

回答

2

我认为你必须配置你的任务的任务控制器。在某些情况下,以不会导致冲突的方式(例如,read访问第一个路径和访问第二个路径的read,write)设置access属性就足够了。如果情况并非如此,那么您可以实现您自己的TaskControllerHandler并使用您的定制逻辑实施方法void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token)。请参阅:Task Controllers

+0

我是这么认为的,这是正确的答案。使用jBPM你写一个“工作流程程序”,它必须解决它自己的独特问题,因为没有一般的变量同步是完美的。 – 2008-10-28 22:45:08

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"/> 

最后我曾获得三个变量,共享权和“fromRight”,这是由脚本设置对父母明确。

共享变量从右边的分叉处取值,左边的变化似乎消失了。

注意,转换是不是我真正异步的,在整个试验将在一个事务已经运行,这些因素可能会影响结果

+0

因为这是在一个线程(可能是?)中运行的,实际发生的情况是左侧分支(先运行)的更改被右侧分叉中发生的更改覆盖。 – Marco 2011-11-23 01:21:50