JBPM (六) compare decision with state

   我们通过一个简单的流程例子,来比较这两个节点之间的区别


  在执行“是否困”状态的时候分成了”早起“和”晚起“两种情况

  描述文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<process name="test" xmlns="http://jbpm.org/4.4/jpdl">
   <start name="start1" g="311,21,48,48">
      <transition name="to state1" to="是否困" g="-56,-22"/>
   </start>
   <state name="是否困" g="293,126,92,52">
      <transition name="早起" to="" g="-56,-22"/>
      <transition name="晚起" to="" g="-56,-22"/>
   </state>
   <state name="早起" g="195,230,92,52">
      <transition name="to end1" to="end1" g="-50,-22"/>
   </state>
   <state name="晚起" g="403,223,92,52">
      <transition name="to end1" to="end1" g="-50,-22"/>
   </state>
   <end name="end1" g="331,355,48,48"/>
</process>

测试代码如下:

	@Override
	public void testStateInstance() {
		
		super.startUp();
		ProcessInstance processInstance=executionService.startProcessInstanceByKey("state");
		print("流程实例ID", processInstance.getId());
		
        // 判断当前是否位于"是否困"节点

        System.out.println("是否位于“是否困”节点:" + processInstance.isActive("是否困"));
        System.out.println("为了learn english向下执行...");
        
        ProcessInstance processInstanceGetUPEary=executionService.signalExecutionById(processInstance.getId(), "早起");

        System.out.println("当前流程是否位于早起节点---->"+processInstanceGetUPEary.isActive("早起"));
        System.out.println("当前流程是否结束---->"+processInstanceGetUPEary.isEnded());
        
        ProcessInstance endinstance=executionService.signalExecutionById(processInstanceGetUPEary.getId());

        System.out.println("当前流程是否结束---->"+endinstance.isEnded());
		
		
	}


   使流程向下执行

executionService.signalExecutionById();

  该方法有多个重载:

ProcessInstance signalExecutionById(String executionId);

//若在流程定义某一个节点没有分支时(只有一个transition时),调用此方法,可将流程继续向下执行 executionId为流程实例Id

ProcessInstance signalExecutionById(String executionId, String signalName);

//若在流程定义某一个节点有多个分支时(有多个transition时),调用此方法,可将流程沿着transition所指的方向向下执行

executionId为流程实例Id, signalName为流程定义中transition节点的name属性的值

ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, ?> parameters);

用于将流程沿着signalName方向(transition的name属性所指的方向)向下继续执行,在执行的过程中顺便传递参数parameters

ProcessInstance signalExecutionById(String executionId, Map<String, ?> parameters);

用于将流程向下继续执行,在执行的过程中顺便传递参数parameters

   注:当一个节点有多个分支时,若要通过signalExecutionById()方法将流程向下执行必须明确指出signalName即(transition的name属性所指的方向),否则流程不会向下执行,仍会停留在当前节点。因为jbpm不确定流程该流向那个方向。

   若不通过这个方法执行,便会按照第一个条件分支往下面执行,这是与decision的不同之处,没有decision那么严格。

   接下来是一个decision的例子,这个是一个分支判断的节点,它更相当于我们程序中的switch case,在我们的生活当中处处充满了选择,有时候一个选择可以决定你的一生、有时候一个选择会让你后悔一生、有时候做一个选择是那么难、有时候学会选择比其他的事情更重要,想要学会选择,就来看看下面的decision。

   下面画一个选择向左还是向右的例子


   定义文件如下:

 

<?xml version="1.0" encoding="UTF-8"?>

<process name="test2" xmlns="http://jbpm.org/4.4/jpdl">
   <start name="start1" g="300,42,48,48">
      <transition name="to decision" to="exclusive1" g="-79,-22"/>
   </start>
   <decision name="exclusive1" g="306,147,48,48">
      <transition name="to first way" to="first way" g="-56,-22">
      		<condition expr="${code=='first way'}"></condition>
      </transition>
      <transition name="to seconed way" to="seconed way" g="-56,-22">
      		<condition expr="${code=='seconed way'}"></condition>
      </transition>
      <transition name="third way" to="end1" g="488,265:-50,-22">
      		<condition expr="${code=='third way'}"></condition>
      </transition>
   </decision>
   <state name="first way" g="137,241,92,52">
      <transition name="to state4" to="sub way" g="-56,-22"/>
   </state>
   <state name="seconed way" g="285,261,92,52">
      <transition name="to end1" to="end1" g="-50,-22"/>
   </state>
   <end name="end1" g="325,464,48,48"/>
   <state name="sub way" g="164,362,92,52">
      <transition name="to end1" to="end1" g="-50,-22"/>
   </state>
</process>

  其中有几种方式可以处理流程的走向

第一种,内置条件

    即在流程定义中设置每一个transition的子节点condition,并为每一个condition填充expr属性

    形如:

    <condition expr="${code=='first way'}"></condition>

    因为在开始的时候指定了流程处理的方向,所以流程向first way方向自动执行。

    第二种,更像switch case

      在decision节点上指定

      <decision g="252,204,48,48" name="exclusive1" expr="${toWhere}">

      修改代码为:

         
         
      Map<String, String> map=new HashMap<String, String>();
      //coder为流程定义中表达式的名称
      map.put("toWhere", "to seconed way");

      其它部分不变,可以看到流程就会走第二条路。

      第三种,配置handler子类

      在流程定义中在decision节点内部配置<handler/>子节点,并设置该元素的class属性为你自己的类)该类实现了org.jbpm.api.jpdl.DecisionHandler.你需要重写

      String decide(OpenExecution execution);方法即可,在该方法最终返回decision活动后的下一个transition的name属性的值。

      修改配置文件

       

         <decision name="exclusive1" g="306,147,48,48">
            <handler class="com.jbpm.decision.HandlerDecision"></handler>
            <transition name="to first way" to="first way" g="-56,-22">
            </transition>
            <transition name="to seconed way" to="seconed way" g="-56,-22">
            </transition>
            <transition name="third way" to="end1" g="488,265:-50,-22">
            </transition>
         </decision>

      添加HandlerDecision并且实现DecisionHandler

      代码如下:

       

      	public class HandlerDecision implements DecisionHandler {
      
      	    @Override
      	    public String decide(OpenExecution execution) {
      	        // TODO Auto-generated method stub
      	        String toWhere = execution.getVariable("toWhere").toString();
      	        String result = null;
      
      	        if ("first way".equals(toWhere)) {
      	            result = "first way";
      	        } else if ("seconed way".equals(toWhere)) {
      	            result = "seconed way";
      	        }else if("third way".equals(toWhere)){
      	        	 result = "third way";
      			}
      	        return result;
      	    }
      
      	}

      测试代码只需要更改map中代码:
        
        
      Map<String, String> map=new HashMap<String, String>();
      //code为流程定义中表达式的名称
      map.put("toWhere", "third way");
      执行测试,得到的流程和之前完全相同。decision节点如果不给出执行哪一个分支就会出现异常,decision是一个严格判断的节点,更严密,建议使用decision作为条件选择。
      • 2
        点赞
      • 0
        收藏
        觉得还不错? 一键收藏
      • 打赏
        打赏
      • 14
        评论
      评论 14
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包

      打赏作者

      李龙生的博客

      你的鼓励将是我创作的最大动力

      ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
      扫码支付:¥1
      获取中
      扫码支付

      您的余额不足,请更换扫码支付或充值

      打赏作者

      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

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

      余额充值