当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