同步汇聚(Synchronizing Merge)
Description : A point in the workow process where multiple paths converge into one single
thread. If more than one path is taken, synchronization of the active threads needs to take place.
If only one path is taken, the alternative branches should reconverge without synchronization.
It is an assumption of this pattern that a branch that has already been activated, cannot be
activated again while the merge is still waiting for other branches to complete.
Synonyms Synchronizing join.
描述 : 流程中某点多条路径聚合成一个线程,若多于一条路径触发,则活动线程需同步;若仅
有一条路径触发,则可选分支应再收敛,无需同步.
同义词: Synchronizing join.
java 代码
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- package org.jbpm.jpdl.patterns;
-
- import junit.framework.*;
-
- import org.jbpm.graph.def.*;
- import org.jbpm.graph.exe.*;
-
- public class Wfp07SynchronizingMergeTest extends TestCase {
-
- private static ProcessDefinition synchronizingMergeProcessDefinition = createSynchronizingMergeProcessDefinition();
-
- public static ProcessDefinition createSynchronizingMergeProcessDefinition() {
- ProcessDefinition pd = Wfp06MultiChoiceTest.createMultiChoiceProcessDefinition();
- return pd;
- }
-
- public void testSynchronizingMergeScenario1() {
- ProcessDefinition pd = synchronizingMergeProcessDefinition;
-
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,1);
- Token tokenB = root.getChild("to b");
-
- tokenB.signal();
- assertSame( pd.getNode("end"), root.getNode() );
- assertSame( pd.getNode("syncmerge"), tokenB.getNode() );
- }
-
- public void testSynchronizingMergeScenario2() {
- ProcessDefinition pd = synchronizingMergeProcessDefinition;
-
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,2);
- Token tokenC = root.getChild("to c");
-
- tokenC.signal();
- assertSame( pd.getNode("end"), root.getNode() );
- assertSame( pd.getNode("syncmerge"), tokenC.getNode() );
- }
-
- public void testSynchronizingMergeScenario3() {
- ProcessDefinition pd = synchronizingMergeProcessDefinition;
-
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,3);
- Token tokenB = root.getChild("to b");
- Token tokenC = root.getChild("to c");
-
- tokenB.signal();
- assertSame( pd.getNode("multichoice"), root.getNode() );
- assertSame( pd.getNode("syncmerge"), tokenB.getNode() );
- assertSame( pd.getNode("c"), tokenC.getNode() );
-
- tokenC.signal();
- assertSame( pd.getNode("end"), root.getNode() );
- assertSame( pd.getNode("syncmerge"), tokenB.getNode() );
- assertSame( pd.getNode("syncmerge"), tokenC.getNode() );
- }
-
- public void testSynchronizingMergeScenario4() {
- ProcessDefinition pd = synchronizingMergeProcessDefinition;
-
- Token root = Wfp06MultiChoiceTest.executeScenario(pd,3);
- Token tokenB = root.getChild("to b");
- Token tokenC = root.getChild("to c");
-
- tokenC.signal();
- assertSame( pd.getNode("multichoice"), root.getNode() );
- assertSame( pd.getNode("b"), tokenB.getNode() );
- assertSame( pd.getNode("syncmerge"), tokenC.getNode() );
-
- tokenB.signal();
- assertSame( pd.getNode("end"), root.getNode() );
- assertSame( pd.getNode("syncmerge"), tokenB.getNode() );
- assertSame( pd.getNode("syncmerge"), tokenC.getNode() );
- }
- }
流程定义文件:
xml 代码
- <process-definition name="process">
- <start-state name='start'>
- <transition to='a' />
- </start-state>
- <state name='a'>
- <transition to='multichoice' />
- </state>
- <fork name='multichoice'>
- <transition name='to b' to='b'>
- <condition>#{scenario == 1} or #{scenario >= 3}</condition>
- </transition>
- <transition name='to c' to='c'>
- <condition>#{scenario == 2} or #{scenario >= 3}</condition>
- </transition>
- </fork>
- <state name='b'>
- <transition to='syncmerge' />
- </state>
- <state name='c'>
- <transition to='syncmerge' />
- </state>
- <join name='syncmerge'>
- <transition to='end' />
- </join>
- </process-definition>
testSynchronizingMergeScenario1()
当scenario == 1
节点流程如下:
start --> a --> multichoice --> b --> syncmerge --> end
testSynchronizingMergeScenario2()
当scenario == 2
节点流程如下:
start --> a --> multichoice --> c --> syncmerge --> end
testSynchronizingMergeScenario3()
当scenario == 3
节点流程如下:
start --> a --> multichoice --> b --> syncmerge(先) --> end
multichoice --> c --> syncmerge(后)
testSynchronizingMergeScenario4()
当scenario == 3
节点流程如下:
start --> a --> multichoice --> b --> syncmerge(后) --> end
multichoice --> c --> syncmerge(先)