一个helloworls流程实例

      由于最近比较空闲,偶尔看到之前桌上的一本《深入浅出jBMP》的书,便想学习一下,熟悉workflow,这系列文章也算是对于整个学习过程的记录,希望能时刻起备忘作用,更希望能为和我一样的初学者提供第一手的学习资料。

      学前准备工作:

            1、Java开发环境

            2、jbpm-jpdl-suite-3.2.3.zip,网上有很多可下载的站点

            3、eclipse,我用的是3.6版本

      主要就是这些,jbpm-jpdl-suite-3.2.3.zip解压缩到任意盘符,里面有针对eclipse的插件包,按照安装插件的方式将对应文件夹拷贝到对应的eclipse目的文件夹中,重启即可。(具体环境配置方法这里不多说,网上有很多)

      准备就绪,进行第一个示例的展示,我是按照树上的例子来学习的,helloworld,哈哈,是不是很熟悉,感觉不管到哪都能看见它。使用刚才在eclipse集成好的designer插件之后,就可以通过拖 拽的方式来流程部署,很简单!

      拖拽完流程之后,就可以写和test方法进行测试,书上的例子是写main方法,个人觉得junit更方便。我的代码如下:

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;

/**
 * 流程的测试方法
 * 
 * @author zhang_lei
 * 
 */
public class HelloWorldTest extends TestCase {

	public void testHelloWorldProcess() throws Exception {

		ProcessDefinition processDefinition = ProcessDefinition
				.parseXmlResource("helloworld/processdefinition.xml");
		assertNotNull("Definition should not be null", processDefinition);
		ProcessInstance instance = new ProcessInstance(processDefinition);
		Token token = instance.getRootToken();
		
		/**
		 * 因为只是建立了流程实例,流程实例并没有向下流转 
		 * 所以该实例应该停留在start-state1节点上
		 */
		System.out.println("1 当前流程所处的节点名称:" + token.getNode().getName());
		assertSame(processDefinition.getStartState(), token.getNode());
		
		/**
		 * 让流程实例向下流转一步
		 */
		token.signal();
		
		/**
		 * 再次打印流程实例所处的节点名
		 * 因为流程实例向下走了一步,所以流程应该走到state1节点上
		 * 而state1节点属于等待节点,所以流程走到这应该停下来
		 */
		System.out.println("2 当前流程所处的节点名称:" + token.getNode().getName());
		assertSame(processDefinition.getNode("state1"), token.getNode());
		
		/**
		 * 让流程继续向下流转
		 */
		token.signal();
		
		/**
		 * 因为state1下面是一个Node节点,
		 * Node节点是一个流程自动执行的节点,所以流程执行到这里不会停留在
		 * node1节点上,而是自动执行node1节点,流程向下流转,停留在state2
		 */
		System.out.println("3 当前流程所处的节点名称:" + token.getNode().getName());
		
		/**
		 * TODO:
		 *      此处用assertSame出处,
		 *      不知是否为Node的取对象与state不一样
		 *      ps:此处流程不停止,可能token.getNode()无效
		 */
		System.out.println("***"+processDefinition.getNode("node1").getName());
//		assertSame(processDefinition.getNode("node1"), token.getNode());
		
		/**
		 * 再次打印流程实例所处的节点名
		 * 因为流程实例向下走了一步,所以流程应该走到state2节点上
		 * 而state2节点属于等待节点,所以流程走到这应该停下来
		 */
		System.out.println("4 当前流程所处的节点名称:" + token.getNode().getName());
		assertSame(processDefinition.getNode("state2"), token.getNode());
		
		/**
		 * 让流程继续向下流转,这是就应该到达end-state1节点
		 * 整个helloworld流程就运行结束了,这时的状态应该为结束
		 */
		token.signal();
		System.out.println("5 当前流程所处的节点名称:" + token.getNode().getName());
		assertSame(processDefinition.getNode("end-state1"), token.getNode());
		
		/**
		 * 打印出当前流程是否结束
		 */
		System.out.println("6 当前流程的状态:"+token.getProcessInstance().hasEnded());
		assertTrue(token.getProcessInstance().hasEnded());
	}

}

      上面的代码是我修改之后的。开始是按照书上的来写,就是简单的System打印语句,貌似不能满足测试方法的要求。另外,书上的代码一直没调通,debug的半天,再结合一些基本概念,发现原来是书上写错了,唉,不可全信书本。错误的原因就在名为“node1”的node节点上,node节点处若没有action,则不会停留,继续往下走,但是书上在此处使用了token.signal()让其继续向下,根本是多此一举,甚至是导致了错误。state节点需要调用方法继续进行,这个问题可是费了我挺长时间,对于我这种初学者,这种错误可是很头疼的啊!

      基本上第一章的内容就是这些,对于常用的元素有了大体的了解,下面的内容稍后继续哈!

你可能感兴趣的:(JBPM学习)