您的位置:首页 > 产品设计 > 产品经理

Jbpm 4.4学习笔记(一)

2013-11-01 13:15 483 查看
1.Jbpm 4.4的配置。我的是在eclipse ee版本使用,在myeclipse下同理。

①下载压缩包jbpm-4.4,解压

②接下来上图



③还是图



④安装完后重启eclipse,安装完毕。

⑤新建一个java project,Src下:New——>Jboss jbpm jbpm4 process definition,这时有了一个文件:xxxx.jpdl.xml

⑥添加外部jar包:Jbpm.jar,还有解压后的压缩包lib/下所有的jar包(先用着,后面再精简),build path之

⑦添加配置文件,将examples/src下的配置(除了org文件夹和css文件)都copy到src。jbpm.cfg.xml为核心配置文件,jbpm.hibernate.cfg.xml为hibernate配置文件。这时还得修改jbpm.hibernate.cfg.xml部分内容,换成mysql的连接。

<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/oa</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.format_sql">true</property>

⑧这还不算完,还有最重要的一步。解决设计器中文乱码问题,修改eclipse.ini或myeclipse.ini,最后增加代码:

-Dfile.encoding=UTF-8

⑨配置完毕,可以使用了。

2.下面贴出一个简单的例子

public class Test {
public static void main(String[] args) {
Configuration conf = new Configuration();
ProcessEngine engine = conf.buildProcessEngine();
//这两句代码可以建立数据库表

//RepositoryService pd的发布、删除、查询
RepositoryService rs = engine.getRepositoryService();

//pd 流程定义 	抽象规范 processdefinition
//pi 流程实例 	具体信息 ProcessInstance
//deploy 发布流程定义
rs.createDeployment()
.addResourceFromClasspath("jpdl/drive.jpdl.xml")
.deploy();//发布
//ExecutionService是流程的执行
ExecutionService es =  engine.getExecutionService();

//根据paid执行
es.startProcessInstanceById("drive-4");

es.startProcessInstanceById("drive-4", "to state2");

//流程定义的节点状态分为两种
//1.等待节点		比如state
//2.自动执行节点		比如start end
//3.decision是一个自动执行的节点

}
}

注意注释内容。

在数据库中会生成如下表

JBPM4_DEPLOYMENT    流程定义表
JBPM4_DEPLOYPROP    流程定义属性表
JBPM4_EXECUTION     流程实例表
JBPM4_HIST_ACTINST  流程活动(节点)实例表
JBPM4_HIST_DETAIL   流程历史详细表
JBPM4_HIST_PROCINST 流程实例历史表
JBPM4_HIST_TASK     流程任务实例历史表
JBPM4_HIST_VAR      流程变量(上下文)历史表
JBPM4_ID_GROUP      组表
JBPM4_ID_MEMBERSHIP 用户角色表
JBPM4_ID_USER       用户表
JBPM4_JOB           定时表
JBPM4_LOB           存储表
JBPM4_PARTICIPATION 参与者表
JBPM4_SWIMLANE      泳道表
JBPM4_TASK          任务表
JBPM4_VARIABLE      上下文表

3.当然每次建表、发布(deploy)等都是一样的操作,所以可将其封装。类似于HiberUtil。

public class JbpmUtil {
private static ProcessEngine engine;
private static RepositoryService rs;
private static ExecutionService es;

static{
Configuration conf = new Configuration();
engine = conf.buildProcessEngine();//建立数据库表
rs = engine.getRepositoryService();//pd的发布、查询、删除
es = engine.getExecutionService();//流程的执行
}

public static RepositoryService getRs() { //只写get方法即可
return rs;
}

public static ExecutionService getEs() {
return es;
}

public static void deploy(String filePath){
rs.createDeployment()
.addResourceFromClasspath(filePath)//这样写,而不是写成一行的好处是出错时容易定位
.deploy();
}

}

4.在有关desion的程序时,在desion节点的Expression可以写表达式供其流程选择。不过需要注意写三目运算符时,表达式要写到#{}内,而不是${},如

#{dayCount>5?'to 经理审批':'to 老板审批'}



而且运算符中只能写大于号(>),写小于号(<)会报错:

xml validation error: 与元素类型 "null" 相关联的 "expr" 属性值不能包含 '<' 字符。

在程序中可以这样使用expression

Map<String, Object>  map = new HashMap<String, Object>();
map.put("dayCount", 6);
executionService.signalExecutionById(pi.getId(), map);

5.desion节点处也可写java代码,在desion的Handle class处写java类的路径。如com.bjsxt.handler.MyHandler

而MyHandler如下

public class MyHandler implements DecisionHandler {

public String decide(OpenExecution execution) {
Integer dayCount =(Integer) execution.getVariable("dayCount");

if(dayCount>5){
return "to state2";
}else {
return "to state3";
}
}

}

6.completeTask()和signalExecutionById()一样,都是执行括号内容。

7.在task节点中,也可写入实体类。不过实体类需实现(implements) Serializable,并且要定义一个唯一的表示UID,系统默认的即可。如

private static final long serialVersionUID = 1L;

否则在修改实体类属性(增加或删除、修改)后会报错。因为数据库存储时也会给实体类一个UID,若实体类不加UID就改变属性,那么此时两个实体类(数据库和程序代码里的)会不一致而报错。

此时MyHandler变为

public class MyHandler implements DecisionHandler {

public String decide(OpenExecution execution) {
User user = (User) execution.getVariable("user");

if(user.getDayCount()>5){
return "to state2";
}else {
return "to state3";
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: