jeffen2006 发表于 2013-1-27 06:25:36

重新看待jbpm的流程定义

jbpm的流程定义从发布上看有2种方式,一种是发布持久化到关系型数据库中,另一种则是由java代码实时生成。
之前一直关注持久化的方式,每次都是生成好固定的xml文件,然后发布到数据中,然后再从数据库中检索出来使用。
不过通过2天的学习,第二种代码生成的方式有着第一种持久化方式所不能替代的优点。下面通过一个简单但是非常实用的例子来说明。
网上有很多人在问,fork分出去的多条路线,为什么一定要全部到达join后才能延续流程,能不能其中部分路线到达后流程就继续呢。很多人通过了很复杂的方法实现了这个功能。下面我就介绍一个简单的办法,在fork下增加script元素:
<div class="dp-highlighter"><div class="bar">   
[*]package com.jeffentest;      
[*]import org.jbpm.*;      
[*]import org.jbpm.graph.def.ProcessDefinition;      
[*]import org.jbpm.graph.exe.*;      
[*]import org.jbpm.context.exe.ContextInstance;      
[*]     
[*]     
[*]public class Jeffentest {      
[*]    static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();      
[*]    static ProcessDefinition processDefinition = null;      
[*]    static ProcessInstance processInstance = null;      
[*]    //static SchedulerSession schedulerSession =null;      
[*]    private static void run(){      
[*]        //JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();      
[*]        try {      
[*]            processDefinition= ProcessDefinition.parseXmlString(      
[*]                      "<process-definition>" +      
[*]                      "  <start-state name='start'>" +      
[*]                      "    <transition to='a' />" +      
[*]                      "  start-state>" +      
[*]                      "  <state name='a'>" +      
[*]                      "    <transition to='multichoice' />" +      
[*]                      "  state>" +      
[*]                      "  <fork name='multichoice'>" +      
[*]                      "    <script>" +      
[*]                      "      <variable name='transitionNames' access='write' />" +      
[*]                      "      <expression>" +      
[*]                      "        transitionNames = new ArrayList();" +      
[*]                      "        if ( scenario == 1 ) {" +      
[*]                      "          transitionNames.add( \"to b\" );" +      
[*]                      "        } else if ( scenario == 2 ) {" +      
[*]                      "          transitionNames.add( \"to c\" );" +      
[*]                      "        } else if ( scenario >= 3 ) {" +      
[*]                      "          transitionNames.add( \"to b\" );" +      
[*]                      "          transitionNames.add( \"to c\" );" +      
[*]                      "        }" +      
[*]                      "      expression>" +      
[*]                      "    script>" +      
[*]                      "    <transition name='to b' to='b' />" +      
[*]                      "    <transition name='to c' to='c' />" +      
[*]                      "  fork>" +      
[*]                      "  <state name='b'>" +      
[*]                      "    <transition to='syncmerge' />" +      
[*]                      "  state>" +      
[*]                      "  <state name='c'>" +      
[*]                      "    <transition to='syncmerge' />" +      
[*]                      "  state>" +      
[*]                      "  <join name='syncmerge'>" +      
[*]                      "    <transition to='end' />" +      
[*]                      "  join>" +      
[*]                      "  <end-state name='end'>end-state>" +      
[*]                      "process-definition>"      
[*]                    );      
[*]            processInstance= new ProcessInstance(processDefinition);      
[*]            ContextInstance ci = (ContextInstance) processInstance.getInstance( ContextInstance.class );      
[*]            Token root = processInstance.getRootToken();      
[*]            System.out.println(root.getNode());//StartState(start)      
[*]            root.signal();      
[*]            System.out.println(root.getNode());//State(a)      
[*]            ci.setVariable( "scenario", new Integer(2) );      
[*]            root.signal();      
[*]            Token tokenB = root.getChild("to b");       
[*]            Token tokenC = root.getChild("to c");      
[*]            System.out.println(root.getNode());//Fork(multichoice)      
[*]            System.out.println("tokenC:"+tokenC.getNode());//tokenC:State(c)      
[*]            tokenC.signal();      
[*]            System.out.println("tokenC:"+tokenC.getNode());//tokenC:Join(syncmerge)      
[*]            System.out.println(root.getNode());//EndState(end)      
[*]                  
[*]        }catch(Exception e){      
[*]            e.printStackTrace();      
[*]        }finally {      
[*]              //jbpmContext.close();      
[*]        }      
[*]    }         
[*]    public static void main(String[] args) {      
[*]        run();      
[*]    }      
[*]}   
页: [1]
查看完整版本: 重新看待jbpm的流程定义