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();
        }
    }
posted @ 2019-09-04 10:10  undifinedException  阅读(1632)  评论(0编辑  收藏  举报