JBPM学习(三):管理流程定义

简介: 本文主要讲管理流程定义

最近发现这篇文章挺多人看的,也挺多人有疑问,我很想帮你们解答,但是很无奈,这篇文章只是我当时在自学时看的一个教程的记录,当时对JBPM也没有深入去学习,并且到现在也已经快4年了,这期间我都没用过JBPM,因此JBPM的东西我也忘得差不多了。庆幸的是我把当时看的教程保存了下来,因此如果对此文章有疑问的可以直接看JBPM的教程。另外,通过我分享的视频大家也能看到这是一个OA教程,我当时刚入门自学Java时就看过这个教程,这是一个使用Spring+Struts 2 +Hibernate框架搭建OA的教程,我自己觉得是一个很不错的教程,讲师的声音很好听,听了让人很舒服,特别适合新手。


作者更新于2020-06-04





概念:

ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程、报销流程、是一个规则。


ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程步骤的信息。没有更新操作,启动流程实例时是使用指定key的最新的版本。


1.部署流程定义


a)一次添加一个资源,相关文件在Classpath中


// 1,部署流程定义(添加)
  // jbpm4_deployment
  // jbpm4_deployprop
  // jbpm4_lob
  @Test
  public void deploy_1() {
    String deploymentId = processEngine.getRepositoryService()//
        .createDeployment()//创建一个部署对象,Deployment:一次部署的信息,含有多个文件
        .addResourceFromClasspath("helloworld/test.jpdl.xml")//往Deployment对象添加资源
        .addResourceFromClasspath("helloworld/test.png")//
        .deploy();//执行部署
    System.out.println("deploymentId = " + deploymentId);
  }


b)一次添加多个资源,多个资源先打成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);
  }

c)说明

1, addResourceFromClasspath(resource); 可以调用多次以添加多个文件。文件重复添加也不会报错。


2, addResourceFromInputStream(resourceName, inputStream)添加一个文件(使用InputStream)


3, addResourcesFromZipInputStream(zipInputStream)添加多个文件,里面也可以有文件夹。


4, 以上方法可以在一起调用。


2.查询所有流程定义


a) 查询所有流程定义

@Test
  public void findAll() {
    // 查询
    List<ProcessDefinition> list = processEngine.getRepositoryService()//
        .createProcessDefinitionQuery()//
        .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//排序条件
        //.count()查询出总数量
        //.page(0, 100)分页,取出前100条记录
        .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
    }
  }

b) 查询所有最新版本的流程定义

@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);//不同的key会保存最新的版本(上面已经按版本升序排列)
    }
    // 显示
    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)


a) 删除某个Deployment

@Test
  public void deleteById() {
    String deploymentId = "1";
    // // 删除某Deployment,如果有关联的执行信息,就抛异常
    // processEngine.getRepositoryService().deleteDeployment(deploymentId);
    // 删除某Deployment,如果有关联的执行信息,就级联删除
    processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
  }

b) 删除指定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());
  }
  }

4.获取部署时的某文件的资源(查看流程图)


a) 查看流程图



@Test
  public void getResourceFromDeployment() throws Exception {
  String deploymentId = "50001";
  String resourceName = "helloworld/test.png"; // 指定的是 jbpm4_lob 表中的name_列的值
  // 获取某Deployment中所有文件资源的名称
  Set<String> names = processEngine.getRepositoryService().getResourceNames(deploymentId);
  for (String name : names) {
    System.out.println(name);
  }
  // 获取某Deployment中指定名称的资源
  InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);
  // 保存到"c:/"中
  OutputStream out = new FileOutputStream("c:/process.png");
  for (int b = -1; (b = in.read()) != -1;) {
    out.write(b);
  }
  in.close();
  out.close();
  }

5.获取流程图中某活动的坐标(不重要)



String processDefinitionId = "test-1"; // 流程定义的id
  String activityName = "start1"; // 活动的名称
  ActivityCoordinates c = processEngine.getRepositoryService().getActivityCoordinates(processDefinitionId, activityName);
  System.out.println("x=" + c.getX() 
    + ",y=" + c.getY() 
    + ",width=" + c.getWidth() 
    + ",height=" + c.getHeight());


相关文章
|
8月前
|
数据库
20activiti - 流程管理定义(查询个人任务)
20activiti - 流程管理定义(查询个人任务)
45 0
20activiti - 流程管理定义(查询个人任务)
|
8月前
|
存储 数据库
13activiti - 流程管理定义(部署流程定义)
13activiti - 流程管理定义(部署流程定义)
42 0
|
8月前
|
XML 缓存 数据格式
12activiti - 流程管理定义(设计流程定义文档)
12activiti - 流程管理定义(设计流程定义文档)
41 0
|
8月前
22activiti - 流程管理定义(查询流程状态)
22activiti - 流程管理定义(查询流程状态)
61 0
|
8月前
18activiti - 流程管理定义(删除key相同的所有不同版本的流程定义)
18activiti - 流程管理定义(删除key相同的所有不同版本的流程定义)
27 0
|
8月前
15activiti - 流程管理定义(删除流程定义)
15activiti - 流程管理定义(删除流程定义)
62 0
|
8月前
14activiti - 流程管理定义(查看流程定义)
14activiti - 流程管理定义(查看流程定义)
43 0
|
8月前
17activiti - 流程管理定义(查询最新版本的流程定义)
17activiti - 流程管理定义(查询最新版本的流程定义)
22 0
|
8月前
|
数据库
19activiti - 流程管理定义(启动流程实例)
19activiti - 流程管理定义(启动流程实例)
31 0
|
8月前
16activiti - 流程管理定义(查看流程图附件)
16activiti - 流程管理定义(查看流程图附件)
28 0