zoukankan      html  css  js  c++  java
  • activiti(二):关于流程部署和删除的一些操作

    前文:activiti(一):idea整合spring和avtiviti

    目录:activiti 目录

    部署流程

    • 提供四种部署方法;
      • 通过读取资源文件进行部署;png文件和bpmn文件
      • 通过 inputstream完成部署
      • 通过读取zip文件流进行部署
      • 通过读取bytes进行部署
    	 /**
         * 获取到部署的总接口
         *
         * @author caodahuan
         * @date 2019/8/28
         * @return void
         */
        public DeploymentBuilder getBuilder(){
            // 1.获取流程引擎实例(如果没有外部扩展,只会有一个默认的流程引擎实例) 这个是保存在一个map里面。
            // 如果自定义流程引擎,请构造ProcessEngine,并在里面注册进去。
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            /*
             * 2.这是个流程部署的仓库接口。它处理流程的部署、删除、销毁、查询...等等(门面接口)
             * 源代码定义:提供对流程定义和部署存储库的访问的服务。主要涉及表:
             *  act_ge_bytearray:二进制数据表  png  bpmn 存在这个表
             *  act_re_deployment:部署信息表(id作为act_ge_bytearray的外键)
             *  act_re_procdef:流程定义数据表
             */
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            /*
             * 3.这个是用于部署新流程的构造器(建造者模式);
             * 有2类接口方法:
             * 第一类:加载资源:
             * (1) addInputStream(...):通过流读取流程文件进行部署
             * (2) addClasspathResource(String resource):通过读取资源文件进行部署(png和bpmn)
             * (3) addZipInputStream(ZipInputStream zipInputStream):通过读取zip文件流进行部署
             *
             * 第二类:建造中补充参数:
             * 设置act_re_deployment表中字段:name、category、key、tenantId等等
             */
            DeploymentBuilder deployment = repositoryService.createDeployment();
    
            return deployment;
        }
    
        /**
         * 第一种部署方法:通过读取资源文件进行部署;png文件和bpmn文件
         * @author caodahuan
         * @date 2019/8/28
         * @return void
         */
        @Test
        public void methodOne(){
    
            // 1. 获取到部署新流程的构造器
            DeploymentBuilder builder = getBuilder();
    
            // 2. 选择部署方式为:通过资源文件进行部署
            builder.addClasspathResource("apply.bpmn");
            builder.addClasspathResource("apply.png");
    
            // 3. 设置一些需要的参数(非必须)
            builder.key("key"); // 设置key,可重复,可用来启动流程
            builder.name("报销流程"); // 设置流程名称
            builder.category("3"); // 流程类型
    
            // 4. 部署流程
            builder.deploy();
        }
    
        /**
         * 第二种部署方式:通过 inputstream完成部署
         * 一般如果将流程嵌入到本地运营系统中,我们就是使用这种方法,创建文件之后上传到后台进行读取部署。
         * @author caodahuan
         * @date 2019/8/28
         * @return void
         */
        @Test
        public void methodTwo() throws Exception{
    
            // 1.获取部署构造器
            DeploymentBuilder builder = getBuilder();
    
            // 2.获取部署的资源文件:通过inputstream完成部署
            InputStream inputStream = new FileInputStream("C:/Users/84604/Desktop/aa/apply.bpmn");
            builder.addInputStream("apply.bpmn",inputStream);
    
            // 3. 设置一些需要的参数(非必须)
            builder.key("apply_key"); // 设置key,可重复,可用来启动流程
            builder.name("报销流程"); // 设置流程名称
    
            // 4. 部署流程
            builder.deploy();
        }
    
        /**
         * 第三种部署方式:通过读取zip文件流进行部署
         * 将apply.bpmn和apply.png打成一个zip包
         * 一般如果将流程嵌入到本地运营系统中,我们就是使用这种方法,创建文件之后上传到后台进行读取部署。
         * @author caodahuan
         * @date 2019/8/28
         * @return void
         */
        @Test
        public void methodThree() throws Exception{
    
            // 1. 获取部署构造器
            DeploymentBuilder builder = getBuilder();
    
            // 2.获取部署的资源文件:通过读取zip文件流进行部署
            InputStream inputStream = new FileInputStream("C:/Users/84604/Desktop/aa/apply.zip");
            ZipInputStream zipInputStream = new ZipInputStream(inputStream);
            builder.addZipInputStream(zipInputStream);
    
            // 3. 设置一些需要的参数(非必须)
            builder.name("请假流程");
            builder.key("apply_key");
            builder.category("3");
    
            /*
             * 4.部署
             * 此处不删除第二种方法的部署,我们可以发现,部署同一个流程的结果:
             * 在‘流程定义数据表’(act_re_procdef)表中version字段,会有1,2。表示版本已经更新
             */
            builder.deploy();
        }
    
    /**
         * 第四种部署方式:通过读取bytes进行部署
         * 允许直接接受byte流
         * @author caodahuan
         * @date 2019/8/28
         * @return void
         */
        @Test
        public void methodFour() throws Exception{
    
            // 1. 获取部署构造器
            DeploymentBuilder builder = getBuilder();
    
            // 2.获取部署的资源文件:通过读取zip文件流进行部署
            InputStream inputStream = new FileInputStream("C:/Users/84604/Desktop/aa/apply.bpmn");
    
            byte[] b = new byte[inputStream.available()];
            inputStream.read(b);
    
            builder.addBytes("apply_bpmn",b);
    
            // 3. 设置一些需要的参数(非必须)
            builder.name("请假流程");
            builder.key("apply_key");
            builder.category("3");
    
            /*
             * 4.部署
             * 此处不删除第二种方法的部署,我们可以发现,部署同一个流程的结果:
             * 在‘流程定义数据表’(act_re_procdef)表中version字段,会有1,2。表示版本已经更新
             */
            builder.deploy();
        }
    

    删除

    	/**
         * 单体删除:直接指定流程部署表的id进行删除
         * @author caodahuan
         * @date 2019/8/28
         * @return void
         */
        @Test
        public void deleteTeset(){
    
            // 1.获取流程实例
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            // 2. 获取到“部署和流程定义”的接口
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            // 3.通过流程部署操作接口进行删除;第一个参数是部署表act_re_deployment中的主键id。后面的true,表示需要关联删除。
            repositoryService.deleteDeployment("15001",true);
        }
    
        /**
         * 一个完整的删除过程;
         * 1. 先部署
         * 2. 再查询到主键
         * 3. 最后根据主键删除
         * @author caodahuan
         * @date 2019/8/28
         * @return void
         */
        @Test
        public void deleteWhole(){
    
            // 前置一:获取到流程操作接口和部署的构造器
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            RepositoryService repositoryService = processEngine.getRepositoryService(); // 流程操作接口
            DeploymentBuilder builder = repositoryService.createDeployment(); // 流程构造器
    
            // 1. 创建流程
            builder.addClasspathResource("apply.bpmn");
            builder.addClasspathResource("apply.png");
            builder.key("apply_key");
            builder.deploy();
    
            // 2. 根据key来查询到流程(也可以根据名称来查询)
            DeploymentQuery query = repositoryService.createDeploymentQuery(); // 得到一个查询器
            // 因为主键id是随机生成我们无法知道,所以查询时不能查到唯一(key和name都可重复),只能查到列表。所以需要指定排序参数
            query.orderByDeploymentId();
            query.desc();
            query.deploymentKey("apply_key"); // 根据key来查询
            List<Deployment> list = query.list();
    
            // 3.删除;根据id删除,所以要获取ID。第一个参数是部署表act_re_deployment中的主键id。后面的true,表示需要关联删除。
            if (!CollectionUtils.isEmpty(list)) {
                String deploymentId = list.get(0).getId();
                repositoryService.deleteDeployment(deploymentId,true);
            }
        }
    
    

    打印流程图片

    	 /**
         * 打印流程图片
         * 1.先创建流程
         * 2.查询查询到流程
         * 3.得到ID,并根据ID查询出图片,并输出
         *
         * @author caodahuan
         * @date 2019/8/28
         * @return void
         */
        @Test
        public void testQueryPng() throws Exception{
    
            // 前置一:获取到流程操作接口和部署的构造器
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            RepositoryService repositoryService = processEngine.getRepositoryService(); // 流程操作接口
            DeploymentBuilder builder = repositoryService.createDeployment(); // 流程构造器
    
            // 1. 创建流程
            builder.addClasspathResource("apply.bpmn");
            builder.addClasspathResource("apply.png");
            builder.key("apply_key");
            builder.deploy();
    
            // 2. 根据key来查询到流程(也可以根据名称来查询)
            DeploymentQuery query = repositoryService.createDeploymentQuery(); // 得到一个查询器
            // 因为主键id是随机生成我们无法知道,所以查询时不能查到唯一(key和name都可重复),只能查到列表。所以需要指定排序参数
            query.orderByDeploymentId();
            query.desc();
            query.deploymentKey("apply_key"); // 根据key来查询
            List<Deployment> list = query.list();
    
    
            // 3. 得到主键,并根据主键和文件名称打印图片!
            if (!CollectionUtils.isEmpty(list)) {
                String deploymentId = list.get(0).getId();
                /**
                 * deploymentID
                 * 文件的名称
                 */
                InputStream inputStream = repositoryService.getResourceAsStream(deploymentId,"apply.png");
                OutputStream outputStream3 = new FileOutputStream("C:/Users/84604/Desktop/aa/apply.png");
                int b = -1 ;
                while ((b=inputStream.read())!=-1){
                    outputStream3.write(b);
                }
                inputStream.close();
                outputStream3.close();
            }
        }
    
  • 相关阅读:
    typeof返回的结果必定是字符串
    coe文件格式
    求余算法的FPGA实现
    dBm
    信噪比
    增益
    总谐波失真THD
    基波与谐波
    Tco时候在干嘛?
    AXI4-Slave自定义IP设计
  • 原文地址:https://www.cnblogs.com/dhcao/p/11457314.html
Copyright © 2011-2022 走看看