jbpm 与 工作流模式 鉴别器(Discriminator)

本文介绍了一种名为鉴别器的工作流元素,它在一个分支完成时激活后续任务,并忽略其他分支。通过Java代码实现并测试了不同场景下鉴别器的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鉴别器(Discriminator)
Description :    The discriminator is a point in a workow process that waits for one of the
incoming branches to complete before activating the subsequent activity. From that moment on
it waits for all remaining branches to complete and \ignores" them. Once all incoming branches
have been triggered, it resets itself so that it can be triggered again (which is important
otherwise it could not really be used in the context of a loop).


描述:多分支汇聚的时候,只有一个分支可以激活所属任务,这个任务激活以后,其他分支的
到来都会被忽略。
java 代码
 
  1. /* 
  2.  * JBoss, Home of Professional Open Source 
  3.  * Copyright 2005, JBoss Inc., and individual contributors as indicated 
  4.  * by the @authors tag. See the copyright.txt in the distribution for a 
  5.  * full listing of individual contributors. 
  6.  * 
  7.  * This is free software; you can redistribute it and/or modify it 
  8.  * under the terms of the GNU Lesser General Public License as 
  9.  * published by the Free Software Foundation; either version 2.1 of 
  10.  * the License, or (at your option) any later version. 
  11.  * 
  12.  * This software is distributed in the hope that it will be useful, 
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
  15.  * Lesser General Public License for more details. 
  16.  * 
  17.  * You should have received a copy of the GNU Lesser General Public 
  18.  * License along with this software; if not, write to the Free 
  19.  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 
  20.  * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 
  21.  */  
  22. package org.jbpm.jpdl.patterns;  
  23.   
  24. import junit.framework.TestCase;  
  25.   
  26. import org.jbpm.graph.def.ProcessDefinition;  
  27. import org.jbpm.graph.exe.Token;  
  28. import org.jbpm.graph.node.Join;  
  29.   
  30. /** 
  31.  * http://is.tm.tue.nl/research/patterns/download/swf/pat_9.swf 
  32.  */  
  33. public class Wfp09DiscriminatorTest extends TestCase {  
  34.   
  35.   private static ProcessDefinition discriminatorProcessDefinition = createDiscriminatorProcessDefinition();  
  36.   
  37.   public static ProcessDefinition createDiscriminatorProcessDefinition() {  
  38.     ProcessDefinition pd = createSynchronizingDiscriminatorProcessDefinition();  
  39.       
  40.     // configure the join as a discriminator  
  41.     Join join = (Join) pd.getNode("discriminator");  
  42.     join.setDiscriminator(true);  
  43.       
  44.     return pd;  
  45.   }  
  46.   
  47.   private static ProcessDefinition synchronizingdiscriminatorProcessDefinition = createSynchronizingDiscriminatorProcessDefinition();  
  48.   
  49.   public static ProcessDefinition createSynchronizingDiscriminatorProcessDefinition() {  
  50.     ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(  
  51.       "<process-definition>" +  
  52.       "  <start-state name='start'>" +  
  53.       "    <transition to='a' />" +  
  54.       "  </start-state>" +  
  55.       "  <state name='a'>" +  
  56.       "    <transition to='multichoice' />" +  
  57.       "  </state>" +  
  58.       "  <fork name='multichoice'>" +  
  59.       "    <script>" +  
  60.       "      <variable name='transitionNames' access='write' />" +  
  61.       "      <expression>" +  
  62.       "        transitionNames = new ArrayList();" +  
  63.       "        if ( scenario == 1 ) {" +  
  64.       "          transitionNames.add( \"to b\" );" +  
  65.       "        } else if ( scenario == 2 ) {" +  
  66.       "          transitionNames.add( \"to c\" );" +  
  67.       "        } else if ( scenario >= 3 ) {" +  
  68.       "          transitionNames.add( \"to b\" );" +  
  69.       "          transitionNames.add( \"to c\" );" +  
  70.       "        }" +  
  71.       "      </expression>" +  
  72.       "    </script>" +  
  73.       "    <transition name='to b' to='b' />" +  
  74.       "    <transition name='to c' to='c' />" +  
  75.       "  </fork>" +  
  76.       "  <state name='b'>" +  
  77.       "    <transition to='discriminator' />" +  
  78.       "  </state>" +  
  79.       "  <state name='c'>" +  
  80.       "    <transition to='discriminator' />" +  
  81.       "  </state>" +  
  82.       "  <join name='discriminator'>" +  
  83.       "    <transition to='d' />" +  
  84.       "  </join>" +  
  85.       "  <state name='d' />" +  
  86.       "</process-definition>"  
  87.     );  
  88.             
  89.     return processDefinition;  
  90.   }  
  91.   
  92.   public void testDiscriminatorScenario1() {  
  93.     ProcessDefinition pd = discriminatorProcessDefinition;  
  94.     Token root = Wfp06MultiChoiceTest.executeScenario(pd,1);  
  95.     Token tokenB = root.getChild("to b");   
  96.   
  97.     tokenB.signal();  
  98.     assertSame( pd.getNode("d"), root.getNode() );  
  99.     assertSame( pd.getNode("discriminator"), tokenB.getNode() );  
  100.   }  
  101.     
  102.   public void testDiscriminatorScenario2() {  
  103.     ProcessDefinition pd = discriminatorProcessDefinition;  
  104.     Token root = Wfp06MultiChoiceTest.executeScenario(pd,2);  
  105.     Token tokenC = root.getChild("to c");   
  106.   
  107.     tokenC.signal();  
  108.     assertSame( pd.getNode("d"), root.getNode() );  
  109.     assertSame( pd.getNode("discriminator"), tokenC.getNode() );  
  110.   }  
  111.     
  112.   public void testDiscriminatorScenario3() {  
  113.     ProcessDefinition pd = discriminatorProcessDefinition;  
  114.     Token root = Wfp06MultiChoiceTest.executeScenario(pd,3);  
  115.     Token tokenB = root.getChild("to b");   
  116.     Token tokenC = root.getChild("to c");   
  117.   
  118.     tokenB.signal();  
  119.     assertSame( pd.getNode("d"), root.getNode() );  
  120.     assertSame( pd.getNode("discriminator"), tokenB.getNode() );  
  121.     assertSame( pd.getNode("c"), tokenC.getNode() );  
  122.   
  123.     tokenC.signal();  
  124.     assertSame( pd.getNode("d"), root.getNode() );  
  125.     assertSame( pd.getNode("discriminator"), tokenB.getNode() );  
  126.     assertSame( pd.getNode("discriminator"), tokenC.getNode() );  
  127.   }  
  128.     
  129.   public void testDiscriminatorScenario4() {  
  130.     ProcessDefinition pd = discriminatorProcessDefinition;  
  131.     Token root = Wfp06MultiChoiceTest.executeScenario(pd,4);  
  132.     Token tokenB = root.getChild("to b");   
  133.     Token tokenC = root.getChild("to c");   
  134.   
  135.     tokenC.signal();  
  136.     assertSame( pd.getNode("d"), root.getNode() );  
  137.     assertSame( pd.getNode("b"), tokenB.getNode() );  
  138.     assertSame( pd.getNode("discriminator"), tokenC.getNode() );  
  139.   
  140.     tokenB.signal();  
  141.     assertSame( pd.getNode("d"), root.getNode() );  
  142.     assertSame( pd.getNode("discriminator"), tokenB.getNode() );  
  143.     assertSame( pd.getNode("discriminator"), tokenC.getNode() );  
  144.   }  
  145.   
  146.   public void testDiscriminatorScenario5() {  
  147.     ProcessDefinition pd = synchronizingdiscriminatorProcessDefinition;  
  148.     Token root = Wfp06MultiChoiceTest.executeScenario(pd,5);  
  149.     Token tokenB = root.getChild("to b");   
  150.     Token tokenC = root.getChild("to c");   
  151.   
  152.     tokenB.signal();  
  153.     assertSame( pd.getNode("multichoice"), root.getNode() );  
  154.     assertSame( pd.getNode("discriminator"), tokenB.getNode() );  
  155.     assertSame( pd.getNode("c"), tokenC.getNode() );  
  156.   
  157.     tokenC.signal();  
  158.     assertSame( pd.getNode("d"), root.getNode() );  
  159.     assertSame( pd.getNode("discriminator"), tokenB.getNode() );  
  160.     assertSame( pd.getNode("discriminator"), tokenC.getNode() );  
  161.   }  
  162.   
  163.   public void testDiscriminatorScenario6() {  
  164.     ProcessDefinition pd = synchronizingdiscriminatorProcessDefinition;  
  165.     Token root = Wfp06MultiChoiceTest.executeScenario(pd,3);  
  166.     Token tokenB = root.getChild("to b");   
  167.     Token tokenC = root.getChild("to c");   
  168.   
  169.     tokenC.signal();  
  170.     assertSame( pd.getNode("multichoice"), root.getNode() );  
  171.     assertSame( pd.getNode("b"), tokenB.getNode() );  
  172.     assertSame( pd.getNode("discriminator"), tokenC.getNode() );  
  173.   
  174.     tokenB.signal();  
  175.     assertSame( pd.getNode("d"), root.getNode() );  
  176.     assertSame( pd.getNode("discriminator"), tokenB.getNode() );  
  177.     assertSame( pd.getNode("discriminator"), tokenC.getNode() );  
  178.   }  
  179. }  


流程定义文件

xml 代码
 
  1. <process-definition>  
  2.   <start-state name='start'>  
  3.     <transition to='a' />  
  4.   </start-state>  
  5.   <state name='a'>  
  6.     <transition to='multichoice' />  
  7.   </state>  
  8.   <fork name='multichoice'>  
  9.     <script>  
  10.       <variable name='transitionNames' access='write' />  
  11.       <expression>  
  12.         transitionNames = new ArrayList();  
  13.         if ( scenario == 1 ) {  
  14.           transitionNames.add( \"to b\" );  
  15.         } else if ( scenario == 2 ) {  
  16.           transitionNames.add( \"to c\" );  
  17.         } else if ( scenario >= 3 ) {  
  18.           transitionNames.add( \"to b\" );  
  19.           transitionNames.add( \"to c\" );  
  20.         }  
  21.       </expression>  
  22.     </script>  
  23.     <transition name='to b' to='b' />  
  24.     <transition name='to c' to='c' />  
  25.   </fork>  
  26.   <state name='b'>  
  27.     <transition to='discriminator' />  
  28.   </state>  
  29.   <state name='c'>  
  30.     <transition to='discriminator' />  
  31.   </state>  
  32.   <join name='discriminator'>  
  33.     <transition to='d' />  
  34.   </join>  
  35.   <state name='d' />  
  36. </process-definition>  




testDiscriminatorScenario1()

节点执行顺序

    start --> a --> multichoice --> b --> discriminator --> d

testDiscriminatorScenario2()

节点执行顺序

    start --> a --> multichoice --> c --> discriminator --> d

testDiscriminatorScenario3()

节点执行顺序

    start --> a --> multichoice --> b --> discriminator --> d
                multichoice --> c --> discriminator(废弃)


testDiscriminatorScenario4()

节点执行顺序

    start --> a --> multichoice --> b --> discriminator(废弃) --> d
                multichoice --> c --> discriminator


testDiscriminatorScenario5()

节点执行顺序

    start --> a --> multichoice --> b --> discriminator --> d
                multichoice --> c --> discriminator


testDiscriminatorScenario6()

节点执行顺序

    start --> a --> multichoice --> b --> discriminator --> d
                multichoice --> c --> discriminator
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值