下载jBPM-JPDL 3.2.2:http://labs.jboss.com/jbossjbpm/jbpm_downloads/下载jPDL Suite版,这个版本是包含所有的一整套工具,下载后是个压缩包解压到 F:/jbpm-jpdl-3.2.2 ,目录下主要包含以下几个子目录:
l src —— jBPM 的源代码
l config —— jBPM及Hibernate与log4j的配置文件
l db —— 各种数据库的建表SQL语句
l lib —— 依赖的第三方依赖类库
l doc —— API文档及用户使用向导
l designer —— 辅助开发 jBPM 的 Eclipse 插件,具体在 eclipse子目录中
l server —— 一个已经配置好了的基于 JBoss 的 jBPM 控制台及示例
将这个包解压到f盘下,F:/jbpm-jpdl-3.2.2
二、安装jBPM 的Eclipse 开发插件
有个辅助工具开发起来方便一点,只不过现在 jBPM 的开发工具插件功能还不算太强,也就一个“项目创建向导”的功能,让你:
(1)不用再去配置 classpath 库的引用了
(2)直接得到了一个 jBPM 的项目初始结构
安装步骤如下:
1) 打开Eclipse选择菜单“Help->Software Updates->Find and Install”;
(2) 弹出窗口中选择“Search for new features to install”,然后点击“Next >”
或者可能直接用link的方式安装这个插件
如果安装成功,则 Eclipse 首选项里多了一个 JBoss jBPM ,另外我们也需要到这个 jBPM 的首选项里做一些配置工作――指定 jBPM 的安装路径(如下图所示)。这个配置主要是为了找到 jbpm 下的各种 jar 包,好让 Eclipse 设置项目的库引用,本文指向的路径是F:/jbpm-jpdl-3.2.2
三、jBPM 的 Hello World
6.1 新建jBPM项目
主菜单“文件->新建->项目”,在弹出的对话框里,有“ Process Project ”项,如下图所示:
选上好,单击“下一步”,起个名“ myjbpm ”,然后就可以单击“完成”了。然后就生成了如下图所示的一个项目结构:
这个项目和通常 Eclipse 的项目结构有点不同,不过这是一个现在非常流行的项目结构,src/java 存放源文件, test/java 存放相应的 JUnit 单元测试代码。如果你用 Maven 来编译构建项目,对这种目录结构一定不陌生。
项目创建起了,介绍一下里面的文件吧:
l MessageActionHandler ,自动生成的一个 ActionHandler 。不想要可以删掉。
l ehcache.xml cache 的配置文件,里面有很详解的英文说明。没有必要可以不用改它。
l hibernate.cfg.xml jBPM 是用 Hibernate 进行工作流的数据存储的,这个就是 Hibernate 的配置文件。后面我们将讲到如何配置这个文件。
l jbpm.cfg.xml jbpm 本身的配置文件。现在是空的,它用的是缺省配置,你想知道有哪些配置就去看这个文件 F:/jbpm-starters-kit-3.2.1/jbpm.3/src/java.jbpm/org/jbpm/default.jbpm.cfg.xml
l log4j.properties 这个是日志 API 包 log4j 的配置文件,用过 log4j 的都知道。
l SimpleProcessTest.java 这个是对最重要的流程配置文件的 processdefinition.xml 单元测试代码。这里表扬一点, jBPM 的优良设计使得它的可测试性非常之高,喜欢写 t 单元测试的人有福了。
l gpd.xml 用于生成流程图的定义文件。都是一些方框的坐标和长宽
l processdefinition.xml 这个是对最重要的流程配置文件,以后写流程要经常和它打交道。
l processimage.jpg 一个流程图
6.2 修改hibernate.cfg.xml
hibernate.cfg.xml 的默认设置是用 HSQL ,这是一个内存数据库,这种内存数据库用来代替项目实际所用的数据库来做单元测试挺不错的。不过我们这里是要试试用 MySQL 那就改一下设置吧。
1 、 MySQL 的更改如下:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">mysql</property>
记得,手动在mysql里建一个空的数据库jbpm
完善库引用,一般加入jdbc库就行了
四、开始编码
1 、定义流程
在src/main/jpdl/sample下建一个新的流程
流程的定义文件是 processdefinition.xml ,这个是一个关键文件, jBPM 的很大一部份内容都是关于它的。在这里我们把原来自动生成的内容,稍做改动:
<?xml version="1.0" encoding="GBK"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="helloworld">
<!-- 申请 -->
<start-state name="request">
<task>
<controller>
<variable name="name" />
<variable name="day" />
<variable name="note" />
</controller>
</task>
<!-- 流程转向 -->
<transition name="to_confirm" to="confirm">
<action name="requestAction"
class ="cn.com.chengang.jbpm.RequestAction">
<reason> 我要请假 </reason>
</action>
</transition>
</start-state>
<!-- 审批 -->
<state name="confirm">
<transition name="to_end" to="end">
<action name="finishAction"
class ="cn.com.chengang.jbpm.ConfirmAction" />
</transition>
</state>
<!-- 结束 -->
<end-state name="end" />
</process-definition>
<controller> 标签定义了三个数据:姓名、请假天数、说明。
<transition> 标签定了 request 节点的一个流程转向,这里是转到 confirm 节点。
<action> 标签定义了流程由一个节点转到另一个节点时,所要执行的动作,动作封装在一个ActionHandler 类中。比如这里当 request 到 confirm 结点时将执行 RequestAction 类的execute 方法。
FinishAction 下面还有一个 <reason> (请假理由),它对应于 FinshAction 的属性 String reason 。
2 、 编写 ActionHandler
在上面 processdefinition.xml 里我们定义了两个 ActionHandler : RequestAction 、ConfirmAction 。其代码如下:
package cn.com.chengang.jbpm;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
public class RequestAction implements ActionHandler {
private static final long serialVersionUID=1L;
private String reason;
public String getReason(){
return reason;
}
public void setReason(String reason){
this.reason=reason;
}
public void execute(ExecutionContext executionContext) throws Exception {
// TODO Auto-generated method stub
executionContext.setVariable("note",reason);
}
}
package cn.com.chengang.jbpm;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
public class ConfirmAction implements ActionHandler {
private static final long serialVersionUID=1L;
public void execute(ExecutionContext executionContext) throws Exception {
// TODO Auto-generated method stub
executionContext.getContextInstance().setVariable("note","准假");
}
}
五、部署processdefinition.xml
1、先建数据库表
建一个Junit测试类如下
package cn.com.chengang.jbpm;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
public class TestJbpm_01 extends TestCase{
public void testJbpm(){
//用于生成Jbpm数据库
JbpmConfiguration.getInstance().createSchema();
}
}
执行,就可以生成jbpm用的数据库表了
2、布署
我们要把 processdefinition.xml 的流程定义的数据部署到数据库中,因为 jBPM 在正式运行的时候不是去读processdefinition.xml 文件,而是去读数据库中的流程定义。 这里写了一个个 JUnit 程序来部署processdefinition.xml
package cn.com.chengang.jbpm;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import junit.framework.TestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
public class DeployProcessTest extends TestCase {
public void testDeployProcessDefinition()throws FileNotFoundException{
//jbpm.cfg.xml取得jbpm的配置
JbpmConfiguration config=JbpmConfiguration.getInstance();
//创建一个jbpm容器
JbpmContext jbpmContext=config.createJbpmContext();
//由processdefinition.xml生成相关对应的流程定义类ProcessDefinition
InputStream is=new FileInputStream("F:/jbpm/myjbpm/src/main/jpdl/simple/helloworld/processdefinition.xml");
ProcessDefinition processDefinition=ProcessDefinition.parseXmlInputStream(is);
//利用容器的方法将流程定义数据部署到数据库上
jbpmContext.deployProcessDefinition(processDefinition);
//关闭jbpmContext
jbpmContext.close();
}
}
运行此程序后,如果不出错,数据库中将会有这个流程的数据。