使用fork/join的常见错误

在实际的流程设计中常常会出现如下的流程:

看上去没什么问题,那么开始编程

xml 代码
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <process-definition xmlns="" name="yytest">  
  3.    <start-state name="start">  
  4.       <transition name="" to="f1">transition>  
  5.    start-state>  
  6.    <fork name="f1">  
  7.       <transition name="to_s1" to="s1">transition>  
  8.       <transition name="to_j1_1" to="j1">transition>  
  9.    fork>  
  10.    <state name="s1">  
  11.       <transition name="" to="f2">transition>  
  12.    state>  
  13.    <fork name="f2">  
  14.       <transition name="to_j1_2" to="j1">transition>  
  15.       <transition name="to_s2" to="s2">transition>  
  16.    fork>  
  17.    <state name="s2">  
  18.       <transition name="to_j1_3" to="j1">transition>  
  19.    state>      
  20.    <join name="j1">  
  21.       <transition name="" to="s3">transition>  
  22.    join>  
  23.    <state name="s3">  
  24.       <transition name="" to="end">transition>  
  25.    state>  
  26.    <end-state name="end">end-state>  
  27.   
  28. process-definition>  
java 代码
  1. private static void run(){   
  2.         JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();   
  3.         try {   
  4.             long processInstanceId =1;   
  5.                processInstance = jbpmContext.loadProcessInstance(processInstanceId);   
  6.                Token root = processInstance.getRootToken();   
  7.                root.signal();   
  8.                Token to_s1 = root.getChild("to_s1");   
  9.                Token to_j1_1 = root.getChild("to_j1_1");   
  10.                System.out.println("root:"+root.getNode());//root:Fork(f1)   
  11.                System.out.println("to_s1:"+to_s1.getNode());//to_s1:State(s1)   
  12.                System.out.println("to_j1_1:"+to_j1_1.getNode());//to_j1_1:Join(j1)   
  13.                to_s1.signal();   
  14.                Token to_s2 = to_s1.getChild("to_s2");   
  15.                Token to_j1_2 = to_s1.getChild("to_j1_2");   
  16.                System.out.println("root:"+root.getNode());//root:Fork(f1)   
  17.                System.out.println("to_s2:"+to_s2.getNode());//to_s2:State(s2)   
  18.                System.out.println("to_j1_2:"+to_j1_2.getNode());//to_j1_2:Join(j1)   
  19.                to_s2.signal();   
  20.                System.out.println("root:"+root.getNode());   
  21.                //注意这里,我们的目的是所有的分支已经结束,root应该到达Join(j1)。但是实际运行结果为root:Fork(f1)   
  22.             }finally {   
  23.               jbpmContext.close();   
  24.             }   
  25.   
  26.     }     

为什么所有的子令牌都结束了,根令牌仍然在fork呢?原因就是fork和join没有配对使用。所以看似正确的流程也一定要经过严格的测试,绝不能想当然。重新编写流程定义文件:

xml 代码
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <process-definition xmlns="" name="yytest">  
  3.    <start-state name="start">  
  4.       <transition name="" to="f1">transition>  
  5.    start-state>  
  6.    <fork name="f1">  
  7.       <transition name="to_s1" to="s1">transition>  
  8.       <transition name="to_j1_1" to="j1">transition>  
  9.    fork>  
  10.    <state name="s1">  
  11.       <transition name="" to="f2">transition>  
  12.    state>  
  13.    <fork name="f2">  
  14.       <transition name="to_j2_1" to="j2">transition>  
  15.       <transition name="to_s2" to="s2">transition>  
  16.    fork>  
  17.    <state name="s2">  
  18.       <transition name="to_j2_2" to="j2">transition>  
  19.    state>      
  20.    <join name="j2">  
  21.         <transition name="to_j1_2" to="j1">transition>  
  22.    join>  
  23.    <join name="j1">  
  24.       <transition name="" to="s3">transition>  
  25.    join>  
  26.    <state name="s3">  
  27.       <transition name="" to="end">transition>  
  28.    state>  
  29.    <end-state name="end">end-state>  
  30.       
  31.   
  32. process-definition>  
java 代码
  1. private static void run(){   
  2.         JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();   
  3.         try {   
  4.             long processInstanceId =1;   
  5.                processInstance = jbpmContext.loadProcessInstance(processInstanceId);   
  6.                Token root = processInstance.getRootToken();   
  7.                root.signal();   
  8.                Token to_s1 = root.getChild("to_s1");   
  9.                Token to_j1_1 = root.getChild("to_j1_1");   
  10.                System.out.println("root:"+root.getNode());//root:Fork(f1)   
  11.                System.out.println("to_s1:"+to_s1.getNode());//to_s1:State(s1)   
  12.                System.out.println("to_j1_1:"+to_j1_1.getNode());//to_j1_1:Join(j1)   
  13.                to_s1.signal();   
  14.                Token to_s2 = to_s1.getChild("to_s2");   
  15.                Token to_j2_1 = to_s1.getChild("to_j2_1");   
  16.                System.out.println("root:"+root.getNode());//root:Fork(f1)   
  17.                System.out.println("to_s2:"+to_s2.getNode());//to_s2:State(s2)   
  18.                System.out.println("to_j2_1:"+to_j2_1.getNode());//to_j2_1:Join(j1)   
  19.                to_s2.signal();   
  20.                System.out.println("root:"+root.getNode());   
  21.                //正确:root:State(s3)   
  22.             }finally {   
  23.               jbpmContext.close();   
  24.             }   
  25.   
  26.     }     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值