當jBPM中的進程分叉到併發路徑中時,這些路徑中的每一個都獲得它們自己的過程變量副本,以便它們彼此獨立運行。jBPM,併發執行和進程變量
但是當路徑再次連接時會發生什麼? 顯然可能存在衝突的更新。 上下文是否恢復到fork之前的狀態? 我可以選擇從單獨的軌道複製單個變量嗎?
當jBPM中的進程分叉到併發路徑中時,這些路徑中的每一個都獲得它們自己的過程變量副本,以便它們彼此獨立運行。jBPM,併發執行和進程變量
但是當路徑再次連接時會發生什麼? 顯然可能存在衝突的更新。 上下文是否恢復到fork之前的狀態? 我可以選擇從單獨的軌道複製單個變量嗎?
我認爲你必須配置你的任務的任務控制器。在某些情況下,以不會導致衝突的方式(例如,read
訪問第一個路徑和訪問第二個路徑的read,write
)設置access
屬性就足夠了。如果情況並非如此,那麼您可以實現您自己的TaskControllerHandler
並使用您的定製邏輯實施方法void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token)
。請參閱:Task Controllers。
我嘗試做一些實驗:
<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」,這是由腳本設置對父母明確。
共享變量從右邊的分叉處取值,左邊的變化似乎消失了。
注意,轉換是不是我真正異步的,在整個試驗將在一個事務已經運行,這些因素可能會影響結果
因爲這是在一個線程(可能是?)中運行的,實際發生的情況是左側分支(先運行)的更改被右側分叉中發生的更改覆蓋。 – Marco 2011-11-23 01:21:50
我是這麼認爲的,這是正確的答案。使用jBPM你寫一個「工作流程程序」,它必須解決它自己的獨特問題,因爲沒有一般的變量同步是完美的。 – 2008-10-28 22:45:08