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);