• 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());

      

  • 相关阅读:
    SQL 查询第n条到第m条的数据
    Linq 中查询一个表中指定的字段
    归并排序与逆序对
    补码拾遗
    堆排序
    It is time to cut the Gordian Knot!
    蛋疼
    [引]Microsoft Visual Studio .NET 2005 预发行版
    关于VS2005中自动生成TableAdapter的事务处理
    关于释放ASPNET进程的内存占用问题.
  • 原文地址:https://www.cnblogs.com/HHR-SUN/p/7223739.html
Copyright © 2020-2023  润新知