2008-09-22 38 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