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