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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM