由于最近比较空闲,偶尔看到之前桌上的一本《深入浅出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节点需要调用方法继续进行,这个问题可是费了我挺长时间,对于我这种初学者,这种错误可是很头疼的啊!
基本上第一章的内容就是这些,对于常用的元素有了大体的了解,下面的内容稍后继续哈!