在实际的流程设计中常常会出现如下的流程:
看上去没什么问题,那么开始编程
xml 代码
- xml version="1.0" encoding="UTF-8"?>
- <process-definition xmlns="" name="yytest">
- <start-state name="start">
- <transition name="" to="f1">transition>
- start-state>
- <fork name="f1">
- <transition name="to_s1" to="s1">transition>
- <transition name="to_j1_1" to="j1">transition>
- fork>
- <state name="s1">
- <transition name="" to="f2">transition>
- state>
- <fork name="f2">
- <transition name="to_j1_2" to="j1">transition>
- <transition name="to_s2" to="s2">transition>
- fork>
- <state name="s2">
- <transition name="to_j1_3" to="j1">transition>
- state>
- <join name="j1">
- <transition name="" to="s3">transition>
- join>
- <state name="s3">
- <transition name="" to="end">transition>
- state>
- <end-state name="end">end-state>
- process-definition>
java 代码
- private static void run(){
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
- long processInstanceId =1;
- processInstance = jbpmContext.loadProcessInstance(processInstanceId);
- Token root = processInstance.getRootToken();
- root.signal();
- Token to_s1 = root.getChild("to_s1");
- Token to_j1_1 = root.getChild("to_j1_1");
- System.out.println("root:"+root.getNode());//root:Fork(f1)
- System.out.println("to_s1:"+to_s1.getNode());//to_s1:State(s1)
- System.out.println("to_j1_1:"+to_j1_1.getNode());//to_j1_1:Join(j1)
- to_s1.signal();
- Token to_s2 = to_s1.getChild("to_s2");
- Token to_j1_2 = to_s1.getChild("to_j1_2");
- System.out.println("root:"+root.getNode());//root:Fork(f1)
- System.out.println("to_s2:"+to_s2.getNode());//to_s2:State(s2)
- System.out.println("to_j1_2:"+to_j1_2.getNode());//to_j1_2:Join(j1)
- to_s2.signal();
- System.out.println("root:"+root.getNode());
- //注意这里,我们的目的是所有的分支已经结束,root应该到达Join(j1)。但是实际运行结果为root:Fork(f1)
- }finally {
- jbpmContext.close();
- }
- }
为什么所有的子令牌都结束了,根令牌仍然在fork呢?原因就是fork和join没有配对使用。所以看似正确的流程也一定要经过严格的测试,绝不能想当然。重新编写流程定义文件:
xml 代码
- xml version="1.0" encoding="UTF-8"?>
- <process-definition xmlns="" name="yytest">
- <start-state name="start">
- <transition name="" to="f1">transition>
- start-state>
- <fork name="f1">
- <transition name="to_s1" to="s1">transition>
- <transition name="to_j1_1" to="j1">transition>
- fork>
- <state name="s1">
- <transition name="" to="f2">transition>
- state>
- <fork name="f2">
- <transition name="to_j2_1" to="j2">transition>
- <transition name="to_s2" to="s2">transition>
- fork>
- <state name="s2">
- <transition name="to_j2_2" to="j2">transition>
- state>
- <join name="j2">
- <transition name="to_j1_2" to="j1">transition>
- join>
- <join name="j1">
- <transition name="" to="s3">transition>
- join>
- <state name="s3">
- <transition name="" to="end">transition>
- state>
- <end-state name="end">end-state>
- process-definition>
java 代码
- private static void run(){
- JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
- try {
- long processInstanceId =1;
- processInstance = jbpmContext.loadProcessInstance(processInstanceId);
- Token root = processInstance.getRootToken();
- root.signal();
- Token to_s1 = root.getChild("to_s1");
- Token to_j1_1 = root.getChild("to_j1_1");
- System.out.println("root:"+root.getNode());//root:Fork(f1)
- System.out.println("to_s1:"+to_s1.getNode());//to_s1:State(s1)
- System.out.println("to_j1_1:"+to_j1_1.getNode());//to_j1_1:Join(j1)
- to_s1.signal();
- Token to_s2 = to_s1.getChild("to_s2");
- Token to_j2_1 = to_s1.getChild("to_j2_1");
- System.out.println("root:"+root.getNode());//root:Fork(f1)
- System.out.println("to_s2:"+to_s2.getNode());//to_s2:State(s2)
- System.out.println("to_j2_1:"+to_j2_1.getNode());//to_j2_1:Join(j1)
- to_s2.signal();
- System.out.println("root:"+root.getNode());
- //正确:root:State(s3)
- }finally {
- jbpmContext.close();
- }
- }