重新看待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]