fork的使用有一些小的地方需要注意。
1 fork节点出去的transition必须有name属性,因为Fork要用该属性来构建子token,如果不指定的话,那么所有的transition的name都为null,则只有一个transition会被调用。
2 fork的行为是依次调用transition,所以在底层它并不是一个并发的模型,如果需要使用并发模型的话,可以考虑jbpm的异步调用,当然,也可以自己起一个Thread去完成一些task。
3 token的name是和transition的name相关的,如下例所示,rootToken的fullName为'/',fork出来的两个子token分别为'/t2','/t1'。
4 join的token必须是兄弟token。
<process-definition name='TestForkProcess'>
<start-state>
<transition to='fork'></transition>
</start-state>
<fork name='fork'>
<transition name ='t1' to='node0'></transition>
<transition name ='t2' to='node1'></transition>
</fork>
<node name='node0'>
<script>
System.out.println("this script is entering node "+node);
token.signal();
</script>
<transition to='joinNode'></transition>
</node>
<node name='node1'>
<script>
System.out.println("this script is entering node "+node);
token.signal();
</script>
<transition to='joinNode'></transition>
</node>
<join name='joinNode'>
<script>
System.out.println("this script is entering node "+node);
</script>
<transition to='end' />
</join>
<end-state name='end' />
</process-definition><process-definition name='TestForkProcess'>
<start-state>
<transition to='fork'></transition>
</start-state>
<fork name='fork'>
<transition name ='t1' to='node0'></transition>
<transition name ='t2' to='node1'></transition>
</fork>
<node name='node0'>
<script>
System.out.println("this script is entering node "+node);
token.signal();
</script>
<transition to='joinNode'></transition>
</node>
<node name='node1'>
<script>
System.out.println("this script is entering node "+node);
token.signal();
</script>
<transition to='joinNode'></transition>
</node>
<join name='joinNode'>
<script>
System.out.println("this script is entering node "+node);
</script>
<transition to='end' />
</join>
<end-state name='end' />
</process-definition>