论坛首页 Java企业应用论坛

使用fork/join的常见错误

浏览 5373 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-05  

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

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

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.     }     
  • 描述: error
  • 大小: 26.1 KB
  • 描述: ok
  • 大小: 27.5 KB
   发表时间:2006-12-05  
D:/eclipse/jbpm/jbpm-starters-kit-3.1.2/jbpm-designer/workspace/yytestjbpm/processes/yytest/processimage.jpg

注意先上传之后再用网络URL引用图片
0 请登录后投票
   发表时间:2006-12-05  
如何上传呢?我点插入图片的按钮,弹出的对话框中没有上传的功能,我就copy的地址。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics