Jbpm 4.4学习笔记(一)

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";
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值