首页 > 代码库 > JBPM

JBPM

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接口的众多实现类。


 

搭建项目进行测试

一.导入Jar包

技术分享

技术分享

技术分享

技术分享

技术分享

二.创建配置文件

技术分享

  在jbpm.hibernate.cfg.xml文件中进行配置oracle数据库以及关联其他配置文件

技术分享

三.新建一张jbpm流程图

  技术分享

技术分享

技术分享

四.编写测试代码

4.1创建数据表,共计18张

 

@Test
    public void create(){
        //创建表     18张
      new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory();
      System.out.println("ok");
            
    }

 

技术分享

技术分享

4.2创建ProcessEngine对象

 

//通过默认的配置文件生成单例的processEngine对象
ProcessEngine pro=Configuration.getProcessEngine();

 

4.3部署流程定义(jbpms.jpdl.xml和jbpms.png是我们创建的文件,以及文件生成的图片

@Test
    public void getDeploy(){
        //部署流程定义
        String re=pro.getRepositoryService()
                .createDeployment()
                .addResourceFromClasspath("jbpms.jpdl.xml")
                .addResourceFromClasspath("jbpms.png").deploy();
        System.out.println(re);
     }

4.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());
    }

4.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());
        }
        
    }

4.6查看当前任务所在点

 

@Test
    public void findSelect(){
        //查询当前任务所在点
        String name=pro.getExecutionService().createProcessInstanceQuery().processInstanceId("jbpms.130001").uniqueResult().findActiveActivityNames().toString();
        System.out.println(name);
    }

 

4.7办理任务

 

public void testCompleteTask(){
        pro.getTaskService().completeTask("130002");
        System.out.println("ok");
    }

 


流程管理

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

JBPM