业务流程管理框架JBPM
1.JBPM4.4业务流程管理框架
JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。它使用Hibernate来管理它的数据库,只要是Hibernate支持的数据库,它都支持
2.ProcessEngine的核心服务
RespositoryService:流程定义的服务接口:包括流程定义的部署、查询、删除等操作。
ExecutionService: 流程执行的服务接口:包括启动流程、实例推进、设置变量等操作。
ManagementService:Web管理控制台的服务接口,包括获得消息和计时器的操作。
HistoryService:历史库的服务接口:包括对流程实例、活动实例进行查询。某个流程定义中的所有的活动的平均持续时间,某个流程定义中的某个活动实例的转移的执行次数等操作。
IdentityService:主要包括用户、组、成员关系等相关的操作
CommondService:command模式的服务接口,实际上将客户端请求全部封装在一个调用接口中,execute(Command cmd),由这个接口去调用command接口的众多实现类。
3. 环境搭建
3.1配置GPD(流程设计器)
Help ------> Install New Software
点击add,出现一个Add Repository
点击Archive,选择jbbm4.4/install/src/gpd/jbpm-gpd-site.zip
选择所有插件,然后点Next即可
3.2配置JBPM运行时
1) 打开window à preferences
2) 选择 JBoss jBPM --> Runtime Locations
3) 点击 Add...
4) 在 Add Location 对话框中,输入一个名字,比如 jbpm-4.4 然后点击 Search...
5) 在 Browse For Folder 对话框中,选择你的jbpm 根目录,然后点击 OK
3.3在目录中添加JPDL4模式
如果你想直接编辑XML 源码, 最好是在你的XML 目录中指定一下模式(schema),这样当你在编辑流程源码的时候,可以更好的帮助你编写代码。
1) 点击窗口 --> 属性(Windows --> Preferences)
2) 选择XML --> 目录(XML --> XML CataLog)
3) 点击添加(Add)
4) 添加XML 目录(Add XML Catalog Entry)的窗口打开
5) 点击map-icon 的图标下面的按钮并选择文件系统(File System)
6) 在打开的对话框中, 选择jBPM 安装目录下src 文件夹中jpdl.xsd 文件
7) 点击打开(Open)并且关闭所有的对话框
3.4定义jBPM 用户库
1) 点击窗口 --> 属性(Windows --> Preferences)
2) 选择Java --> 创建路径 --> 用户类库(Java --> Build Path --> User Libraries)
3) 点击新建(New)
4) 类型名字jBPM Libraries
5) 点击添加JARs(Add External JARs...)
6) 找到jBPM 安装程序下的lib 目录
7) 选择lib 下的所有jar 文件并点击打开(Open)
8) 选择jBPM Libraries 作为入口
9) 重新点击添加JARs(Add External JARs)
10) 在jBPM 的安装程序的根目录下选择jbpm.jar 文件
11) 点击打开(Open)
12) 在jbpm.jar 下选择源码附件(Source attachment)作为入口
13) 点击编辑(Edit)
14) 在源码附件的配置(Source Attachment Configuration)对话框中,点击目录(External Folder...)
15) 找到jBPM 安装程序下的src 目录
16) 点击选择(Choose)
4.创建项目
4.1引jar包
Jbpm4.4的lib目录下除了.zip和.war
4.2 配置文件
Jbpm4.4 --- examples --- src 下的五个文件复制到项目src目录下
<hibernate-configuration>
<session-factory>
<!-- 连接数据库的一些信息 -->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="hibernate.connection.username">jbpm</property>
<property name="hibernate.connection.password">jbpm</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.format_sql">true</property>
<!-- 小配置:映射文件 -->
<mapping resource="jbpm.repository.hbm.xml" />
<mapping resource="jbpm.execution.hbm.xml" />
<mapping resource="jbpm.history.hbm.xml" />
<mapping resource="jbpm.task.hbm.xml" />
<mapping resource="jbpm.identity.hbm.xml" />
</session-factory>
</hibernate-configuration>
4.3画流程图
在src上右键,new ---- Other
4.4代码
1.创建表 18张
@Test
public void create(){
//创建表 18张
new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory();
System.out.println("ok");
}
2.创建ProcessEngine对象
//通过默认的配置文件生成单例的processEngine对象
ProcessEngine pro=Configuration.getProcessEngine();
3.部署流程定义
@Test
public void getDeploy(){
//部署流程定义
String re=pro.getRepositoryService()
.createDeployment()
.addResourceFromClasspath("jbpms.jpdl.xml")
.addResourceFromClasspath("jbpms.png").deploy();
System.out.println(re);
}
4.启动流程实例
@Test
public void testStart(){
//启动流程实例 通过key,key是process节点中的key,如果不写,默认为name的值
ProcessInstance pi=pro.getExecutionService().startProcessInstanceByKey("jbpms");
System.out.println("start ok!");
System.out.println("id:"+pi.getId()+",状态:"+pi.getState()+",流程定义的ID:"+pi.getProcessDefinitionId());
}
5.查看任务列表
@Test
public void selectTask(){
//查看任务列表
String user="hh";
String user2="boss";
List<Task> tasks = pro.getTaskService().findPersonalTasks(user);
for (Task task : tasks) {
System.out.println("任务ID:"+task.getId()+"\t任务名称:"+task.getName()+"\t任务的办理人:"+task.getAssignee());
}
}
6.查看当前任务所在点
@Test
public void findSelect(){
//查询当前任务所在点
String name=pro.getExecutionService().createProcessInstanceQuery().processInstanceId("jbpms.130001").uniqueResult().findActiveActivityNames().toString();
System.out.println(name);
}
7.办理任务
//办理任务
@Test
public void testCompleteTask(){
pro.getTaskService().completeTask("130002");
System.out.println("ok");
}
5.流程管理
1.创建ProcessEngine对象
//通过默认的配置文件生成单例的processEngine对
ProcessEngine pro=Configuration.getProcessEngine();
2.查询流程定义
@Test
public void findAll(){
//查询所有流程定义
List<ProcessDefinition> list=pro.getRepositoryService().createProcessDefinitionQuery().list();
for (ProcessDefinition pd : list) {
System.out.println("id:"+pd.getId()+"\tname:"+pd.getName()+"\tkey:"+pd.getKey()+"\t版本号:"+pd.getVersion()+"\t部署的id:"+pd.getDeploymentId());
}
}
3.查询最新版的流程定义
@Test
public void getNewFindAll(){
//查询最新版的流程定义
//查询所有,让最大的版本排到最后面
List<ProcessDefinition> all=pro.getRepositoryService().createProcessDefinitionQuery().orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION).list();
//过滤出所有最新的版本
Map<String, ProcessDefinition> map=new HashMap<String, ProcessDefinition>();
for (ProcessDefinition pd : all) {
map.put(pd.getKey(), pd);
}
//显示
for (ProcessDefinition pd : map.values()) {
System.out.println("id=" + pd.getId()// 格式为:{key}-{version},用于唯一的标识一个流程定义
+ ", name=" + pd.getName()// 流程定义的名称,jpdl.xml中根元素的name属性的值
+ ", key=" + pd.getKey()// 流程定义的key,jpdl.xml中根元素的key属性的值,默认是name属性的值
+ ", version=" + pd.getVersion()// 自动生成的,同一个名称的第一个为1,以后的自动加1.
+ ", deploymentId=" + pd.getDeploymentId()); // 所属的部署对象
}
}
4.删除(根据id)
@Test
public void deleteById(){
//根据id删除
pro.getRepositoryService().deleteDeployment("1");
System.out.println("delete ok");
}
5.删除(根据key)
@Test
public void deleteByKey(){
//删除指定key的所有版本的流程
List<ProcessDefinition> list=pro.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey("jbpms").list();
for (ProcessDefinition pd : list) {
pro.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());
}
}
6.部署zip格式资源
@Test
public void addZip(){
//部署zip格式的资源
InputStream is=this.getClass().getClassLoader().getResourceAsStream("hh.zip");
ZipInputStream zs=new ZipInputStream(is);
String id= pro.getRepositoryService().createDeployment().addResourcesFromZipInputStream(zs).deploy();
System.out.println("部署成功:deploymentid:"+id);
}
7.查看流程图
@Test
public void getImageResource() throws Exception{
//查看流程图
// 获取指定部署对象中的指下资源的内容
InputStream in=pro.getRepositoryService().getResourceAsStream("50001", "jbpms.png");
//保存到xx盘
OutputStream out=new FileOutputStream("E:/jbpms.png");
for (int b=-1;(b=in.read())!=-1;) {
out.write(b);
}
in.close();
out.close();
System.out.println("----ok---");
}