zoukankan      html  css  js  c++  java
  • JBPM工作流(四)——管理流程定义

    概念:

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

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

    1.部署流程定义

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 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包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @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) 查询所有流程定义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @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) 查询所有最新版本的流程定义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    @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)

      

      

       void deleteDeployment(java.lang.String deploymentId):删除一个部署如果过程定义没有运行执行。历史信息(如果有的话)是在数据库中。
       
       void deleteDeploymentCascade(java.lang.String deploymentId):删除部署,包含过程定义,相关流程实例和他们的历史信息

    a) 删除某个Deployment

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

      b) 删除指定key的所有版本的流程定义

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @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) 查看流程图

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @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.获取流程图中某活动的坐标(不重要)

    1
    2
    3
    4
    5
    6
    7
    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());

      

  • 相关阅读:
    06 is和==的区别 encode()编码 decode()解码
    05 dic的增删改查 字典的嵌套 考试题dic.get()的相关使用
    03 编码 int ,bool,str的常用操作 主要讲str
    01 基本数据类型 变量 if语句
    04 列表的增删改查 常用方法 元祖 range
    02 while循环 格式化输出 运算符
    多校2 Harmonious Army hdu6598 网络流
    P3159 [CQOI2012]交换棋子 网络流
    P2172 [国家集训队]部落战争 最大流
    P2402 奶牛隐藏 网络流
  • 原文地址:https://www.cnblogs.com/HHR-SUN/p/7223739.html
Copyright © 2011-2022 走看看