一个流程定义就是一个有向图,它由节点和转换组成。Hello world流程有三个节点,下面来看一下它们是怎样组装在一起的,我们以一个简单的流程作为开始,不用使用设计器工具,下图展示了hello world流程的图形化表示:
public void testHelloWorldProcess() {
// 这个方法展示了一个流程定义以及流程定义的执行。
// 这个流程定义有3个节点:一个没有命名的开始状态,
// 一个状态“s”,和一个名称为“end”的结束状态。
// 下面这行是解析一段xml文本到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>"
);
// 下面这行是创建一个流程定义的执行。创建后,流程执行有一个
// 主执行路径(=根令牌),它定位在开始状态。
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
// 创建后,流程执行有一个主执行路径(=根令牌)。
Token token = processInstance.getRootToken();
// 创建后,主执行路径被定位在流程定义的开始状态。
assertSame(processDefinition.getStartState(), token.getNode());
// 让我们开始流程执行,通过它的默认转换离开开始状态。
token.signal();
// signal方法将会把流程阻塞在一个等待状态。
// 流程执行进入第一个等待状态“s”,因此主执行路径现在定位
// 在状态“s”。
assertSame(processDefinition.getNode("s"), token.getNode());
// 让我们发送另外一个信号,这将通过使用状态“s”的默认转换
// 离开状态“s”,恢复流程执行。
token.signal();
// 现在signal方法将返回,因为流程示例已经到达结束状态。
assertSame(processDefinition.getNode("end"), token.getNode());
}