Jbpm学习一

import junit.framework.TestCase;

import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;

public class ContextTest extends TestCase {

	public void testContext(){
		ProcessDefinition processDefinition=ProcessDefinition.parseXmlString(
				"<process-definition>"+
				" <start-state>"+
				"  <transition to='s'/>"+
				" </start-state>"+
				"<state name='s'>"+
				"  <transition to='end'/>"+
				"</state>"+
				"  <end-state name='end' />" +
				"</process-definition>"
		);

		//一个流程实例ProcessInstance就是某个流程定义的一次执行。一个流程定义ProcessDefinition可以有多个流程实例。
		//当流程实例ProcessInstance创建的时候,一个主路径就随之创建,这个主路径称为root token。此时主路径指向开始节点start-state
		ProcessInstance processInstance=new ProcessInstance(processDefinition);
		
		//一个运行标记Token代表一个Process Definitio中的一个执行。token是运行时的概念,用来维护指向图节点的指针。
		//token需要一个信号(signal)来让流程向前执行。当一个signal来到的时候。Token就会通过弧(transition)离开当前的节点走到下一个节点。
		Token token=processInstance.getRootToken();
		Token token2=new Token(processInstance);
		
		ContextInstance contextInstance=processInstance.getContextInstance();
		contextInstance.setVariable("amount",new Integer(500));
		contextInstance.setVariable("reason", "i met my deadline");
		
		token2.signal();
		//processInstance.signal();
		
		System.out.println(contextInstance.getVariable("amount"));
		System.out.println(contextInstance.getVariable("reason"));
		
		assertEquals(token2.getNode(), processDefinition.getNode("s"));
		token2.signal();
		//processInstance.signal();
		assertEquals(contextInstance.getVariable("reason"),"i met my deadline");
		System.out.println(token2.getNode().getName());
	}
}



例子是jbpm中自带的。
驱动流程向下运行的方式上面采用
prcessInstance.signal();或token.signal();
通过查看流程实例ProcessInstance的源码可以发现
他的构造函数中会将成员变量rootToken初始化为rootToken=new Token(this);
this表示当前的流程实例对象;在调用processInstance.signal()方法时该方法的实现是
  public void signal() {
    if ( hasEnded() ) {
      throw new IllegalStateException("couldn't signal token : token has ended");
    }
    rootToken.signal();
  }

最终还是调用Token的signal()方法。

获得root Token的方式
Token token=processInstance.getRootToken();
Token token2=new Token(processInstance);

你可能感兴趣的:(jbpm,JUnit)