工作流系统是以规格化的流程描述作为输入的软件组件,它维护流程的运行状态,并在人和应用之间分派活动。
一些基本的术语:
流程定义(process definition)是一个业务流程或过程的规格化描述。
流程实例(process instance). 是流程定义的一个运行实体。
流程上下文变量(process context variable) ,或简称变量,是与流程实例相关的变量
package com.sample;
import junit.framework.TestCase;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
public class testHelloWorldProcess extends TestCase {
public void testHelloWorldProcess() {
// 这个方法展现流程定义和流程执行的定义
// 流程定义有3个节点.
// 一个未命名的开始状态start-state,一个状态 's'
// 一个结束状态名字为'end'.
// 下面行解析一个xml text为一个ProcessDefinition对象(流程定义)
// ProcessDefinition 把流程定义形式描述为java对象
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>");
// 下一行建立了一个流程执行定义.
// 在构造后,流程执行有一个主要的执行路径
// (= root token 根令牌) 此时位置在start-state处
ProcessInstance processInstance = new ProcessInstance(processDefinition);
// 在构造后流程执行有一个主要的执行路径
// (= roottoken 根令牌) .
Token token = processInstance.getRootToken();
// 构造后, 位置处于流程定义执行路径start-state的位置
assertSame(processDefinition.getStartState(), token.getNode());
// 现在开始流程执行,离开start-state 结束默认的转换(transition)
token.signal();
// 这个signal方法将会阻塞直到流程执行进入 wait 状态
// 流程执行在状态's' 进入第一个 等待状态
// 因此执行主路径现在位置在 状态's'
assertSame(processDefinition.getNode("s"), token.getNode());
// 我们再送另外一个信号signal. 这将继续执行离开状态's' 结束默认的转换(transition)
token.signal();
// 现在信号signal方法将返回,因为流程实例到达了end-state 结束状态
assertSame(processDefinition.getNode("end"), token.getNode());
}
}
对于流程定义可以要用JBoss的图形自动生成
点击source会生成下面的代码:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="urn:jbpm.org:jpdl-3.1" name="test">
<start-state name="start">
<transition name="" to="s"></transition>
</start-state>
<state name="s">
<transition name="" to="end"></transition>
</state>
<end-state name="end"></end-state>
</process-definition>
可以把加载流程定义文件,
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>");
改为:
FileInputStream fis = new FileInputStream("processes/test/processdefinition.xml");
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(fis);
对应的流程定义文件为:
<process-definition>
<start-state>
<transition to="auction" />
</start-state>
<state name="auction">
<transition name="auction ends" to="salefork" />
<transition name="cancel" to="end" />
</state>
// fork表示要进行分叉的情形
//一个分支把一个执行路线分割成多个兵法的执行路线. 默认分支的行为是为每个离开分支转换建立一个子令牌,在令牌要到达的分支之间建立一个父母-子女 关系.
<fork name="salefork">
<transition name="shipping" to="send item" />
<transition name="billing" to="receive money" />
</fork>
<state name="send item">
<transition to="receive item" />
</state>
<state name="receive item">
<transition to="salejoin" />
</state>
<state name="receive money">
<transition to="send money" />
</state>
<state name="send money">
<transition to="salejoin" />
</state>
//join表示要进行合并在一起的情形
//默认联合(join)假设所有来自同一个父母的子令牌联合.当在上使用fork(分支)这个情形就出现了并且所有令牌分支建立,并且到达同一个联合(join).当全部令牌都进入联合的时候,联合就结束了. 然后联合将检查父母-子女. 当所有兄弟令牌到达联合(join),父母令牌将传播(唯一的)离开转换. 当还有兄弟令牌活动时,联合的行为将作为等待状态.
<join name="salejoin">
<transition to="end" />
</join>
<end-state name="end" />
</process-definition>
参考资料:http://dl2.csdn.net/down4/20070802/02094345367.swf