JBPM使用1
一、认识JBPM
JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上。
二、安装JBMP
JBPM的工程文件,大家可以到如下网站上去下载:http://www.jboss.com/products/jbpm 目前的最新版本是 3.2.1 ,本文就以此版本为例。在这里请大家下载jbpm-3.2.6.GA这样一个版本。在这个版本里包括一个JBPM流程设计器的Eclipse插件,和一个用JBOSS作为服务器的示例流程等相关文件。解压jbpm-3.2.6.GA到某个特定目录,这里我们首先用到的是包里的JBPM目录下的文件。
JBPM目录里面是JBPM的Eclipse的工程文件,我们可以用Eclipse导入该工程。从Eclipse的File菜单里选择import——> Existing Projects into Workspace——>next…根据向导找到前面提到的JBPM目录就可以把该工程导入到Eclipse当中。
三、安装Eclipse及jBPM开发插件
Eclipse不是开发 jBPM 必须的工具,但它是对 jBPM 开发很有帮助的工具,特别是 jBPM 提供了一个 Eclipse 插件用来辅助开发 jBPM 。关于 Eclipse 的安装请参阅相关文档。本实验安装的是MyEclipse6.0集成Eclipse3.3。
安装完Eclipse安装jBPM的开发插件,步骤如下:
(1) 打开Eclipse选择菜单“Help->Software Updates->Find and Install”;
(2) 弹出窗口中选择“Search for new features to install”,然后点击“Next >”;
(3)点击按扭“New Local Site…”选择插件目录,位于designer/ eclipse目录下,如:E:/Java/tools/jbpm-jpdl- 3.2.2 /designer/eclipse。选定后点“OK”,
(4) 选中“designer/eclipse”,然后点击“Finish”,
四、工作流的工作方式
1。我们首先需要定义一个流程(流程定义ProcessDefinition)
2.该流程可能是多个人发起的,每个人发起的流程称为不同的流程对象(流程实例)(ProcessInstance)
3.每个定义的流程都有许多的步骤我们称为节点(Node)
4.每个执行中的流程的执行路径我们称为路径(Token) 注意二者之间的区别
五、JBPM中节点类型
1. start-state (开始状态)
2. end-state (结束节点 )
3. state(状态) State节点也叫手工节点,进入到这种节点,整个流程的执行就会中断。直到系统外参与者发起继续执行的命令,即调用signal或end方法,业务程序实例的执行才能够继续下去。
4. node(自动节点)
这种节点和State相反,也称自动节点。当业务程序实例执行到这个节点,不会停止执行。而是会继续往下执行。如果该节点存在多个离开转向。那么,就会执行其中的第一个离开转向,在Node状态中,不需要外部参与者的参与,业务流程的这个部分是自动的、即时完成的。
5. task-node (任务节点)
其性质和node节点一样,在没有task的时候,也都是自动执行,不等待。task-node被归类为一个等待节点,是指在task-node中的task列表中的task没有全部执行完之前,它会一直等待。Task可以在task-node节点下定义,也可以挂在process-definition节点下。最普遍的方式是在task-node节点下定义一个或多个任务。默认情况下,流程在task-node节点会处于等待状态,直到所有的任务被执行完毕。Task的执行是按顺序执行的,任务都完成后,token仍然不会指向后面的节点;需要自己手动调用processInstance.signal()才会驱动流程到下面的节点。
六、一个简单的例子
JBPM的流程定义采用XML的方式(实际绝大多数的流程引擎的流程定义都采用的是这种方式),作为测试XML定义我们既可以写在代码当中,也可以以一个独立的XML文件的形式存在,接下来的例子我们将分别为大家介绍一下这两种情况。我们首先来看看把XML流程定义写在代码中的方式。
1、第一个流程定义文件
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="Hello">
<start-state name="begin">
<transition to="mystate"></transition>
</start-state>
<state name="mystate">
<transition to="end"></transition>
</state>
<end-state name="end"></end-state>
</process-definition>
2、流程调用
//定义流程
//文件输出流
InputStream is = new FileInputStream("src/hello.xml");
ProcessDefinition pd = ProcessDefinition.parseXmlInputStream(is);
//定义流程实例,流程的执行token定位在了start-state
ProcessInstance ps = new ProcessInstance(pd);
//执行流程
//获取根路径
Token root = ps.getRootToken();
//流程走向下一个
root.signal("mystate");
System.out.println(root.getNode().getName());
//流程往下走
root.signal();
System.out.println(root.getNode().getName());
}
O(∩_∩)O哈哈~
一上,不足之处,还望指正。谢谢