JBPM之流程定义管理,流程执行管理
其实,我们学习JBPM框架的时候,只要弄懂了什么是JBPM的流程定义,流程执行的管理,那么我们在OA做流转审批的时候,就直接可以来用JBPM了,只需要通过Spring来整合一下就行了。那么下面来说一下吧。
1.什么是JBPM?
jBPM(JBoss Business Process Management业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。JBPM具有很强的灵活性,他可以应用的桌面程序,也可以应用的Web服务,而且提供了一种图形化的业务分析建模工具,并可以将这些业务模型部署的数据库中,任务实例的执行也可以被持久化。
2.JBPM可以来做什么?
业务流程
UML
图形化,定义
控制流程跳转,
分派任务
定时,执行任务,
事件处理等等
3. JBPM入门:
在了解JBPM的时候,我们首先要明白一个概念,那就是什么是流程图? 一个流程图是由节点(Node)和转换(Transition)组成的。一个流程就是一个有向图,流程图有多种表示方式:XML,Java类,数据库中的记录。那么有哪些节点呢? 比如start节点(流程的入口),end节点(流程的结束),state节点(状态节点),我用下面很好的一张图来说明一下,大家看着图就很清楚了。
一个流程图
像流程图这个,一般都是给用户看的,而让电脑识别的是xml文件,eclipse中安装JBPM插件后,我们画上流程图结构示意图之后,相应的xml文件会自动生成,这个我们不用自己写。
下面就说说,有了xml文件(也就是表示了让服务器识别xml文件)之后,我们就在java代码中如何定义一个流程,如何对流程定义进行管理,这里我贴出代码来。
/**
* 管理流程(流程定义)
* @author tyg
*
*/
public class ProcessDefinitionManage {
// private ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();
private ProcessEngine processEngine = Configuration.getProcessEngine(); // 获取单例的ProcessEngine对象,使用的是默认的配置文件(jbpm.cfg.xml)
// 1,部署流程定义(添加)
@Test
public void deploy_1() {
String deploymentId = processEngine.getRepositoryService()//
.createDeployment()//
.addResourceFromClasspath("helloworld/test.jpdl.xml")//
.addResourceFromClasspath("helloworld/test.png")//
.deploy();
System.out.println("deploymentId = " + deploymentId);
}
// 一次添加多个资源(zip)
@Test
public void deploy_2() {
// 找到zip文件
InputStream in = this.getClass().getClassLoader().getResourceAsStream("helloworld/helloworld.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
// 部署
String deploymentId = processEngine.getRepositoryService()//
.createDeployment()//
.addResourcesFromZipInputStream(zipInputStream)//
.deploy();
System.out.println("deploymentId = " + deploymentId);
}
// 2,查询所有流程定义
@Test
public void findAll() {
// 查询
List<ProcessDefinition> list = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//
.list();
// 显示
for (ProcessDefinition pd : list) {
System.out.println("id=" + pd.getId()// 格式为:{key}-{version}
+ ", name=" + pd.getName()// 流程定义文件(.jpdl.xml)中根元素的name属性的值
+ ", key=" + pd.getKey()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值
+ ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1)
+ ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id
}
}
// 查询所有最新版本的流程定义
@Test
public void findAllLatestVersions() {
// 1,查询所有流程定义,按Version升序排列,这样所有最大的版本就都排到最后了
List<ProcessDefinition> allList = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//
// .processDefinitionName("test")//
// .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//
// .orderDesc(ProcessDefinitionQuery.PROPERTY_KEY)//
// .uniqueResult()
// .count()
// .page(firstResult, maxResults)
.list();
// 2,过滤出所需的最新版本的流程定义
Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();
for (ProcessDefinition pd : allList) {
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()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值
+ ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1)
+ ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id
}
}
// 3,删除流程定义(其实是删除Deployment)
@Test
public void deleteById() {
String deploymentId = "1";
// // 删除某Deployment,如果有关联的执行信息,就抛异常
// processEngine.getRepositoryService().deleteDeployment(deploymentId);
// 删除某Deployment,如果有关联的执行信息,就级联删除
processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
}
// 删除指定key的所有版本的流程定义
@Test
public void deleteByKey() {
// 1,查询出指定key的所有版本的流程定义
List<ProcessDefinition> list = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.processDefinitionKey("helloworld")//
.list();
// 2,循环删除
for (ProcessDefinition pd : list) {
processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());
}
}
当我们部署流程定义文件后,剩下的就是流程的执行,任务的完成,只要弄对流程执行的管理之后,相信大家就能够对JBPM就有所认识了。
/**
* 执行流程(流程实例)
* @author tyg
*
*/
public class ProcessInstanceExecute {
private ProcessEngine processEngine = Configuration.getProcessEngine();
// 启动流程实例
@Test
public void startProcessInstance() {
// 使用指定key的最新版本的流程定义启动流程实例
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");
System.out.println("id=" + pi.getId()//
+ ", state=" + pi.getState()//
+ ", processDefinitionId=" + pi.getProcessDefinitionId());
}
// 查询我的未办理完的任务列表
@Test
public void findMyTaskList() {
// String userId = "员工";
// String userId = "部门经理";
String userId = "总经理";
// 查询我所有未办理的任务的列表
// List<Task> list = processEngine.getTaskService().findPersonalTasks(userId);
// 分页的查询
List<Task> list = processEngine.getTaskService()//
.createTaskQuery()//
.assignee(userId)//
.list();
// 显示
System.out.println("【未办理的任务列表如下】");
for (Task t : list) {
System.out.println("id=" + t.getId()//
+ ", name=" + t.getName()// 任务的名称
+ ", assignee=" + t.getAssignee()// 任务的办理人
+ ", createTime=" + t.getCreateTime()// 任务的创建时间
+ ", executionId=" + t.getExecutionId()); // 所属的执行对象的id
}
}
// 办理任务
@Test
public void completeTask() {
String taskId = "120001";
processEngine.getTaskService().completeTask(taskId);
}
}
上面代码有不懂的,可以跟我留言......