Activiti流程实例

一.流程部署(压缩包方式)

/**
     * 压缩包的方式部署流程
     */
    @Test
    public void deploymentByZip(){
        //获取processEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取一个RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //定义一个输入流,加载Zip文件
        InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("bpmn/holiday.zip");
        //定义一个ZIPInputStream对象
        ZipInputStream zipInputStream=new ZipInputStream(inputStream);
        //流程部署
        Deployment deploy = repositoryService.createDeployment()
                .addZipInputStream(zipInputStream)
                .name("请求审批流程")
                .key("holidayKey")
                .deploy();
        System.out.println("流程名称:"+deploy.getName());

    }

 


        
二.流程定义的查看

/**
     * 流程定义信息的查看
     */
    @Test
    public void getProDef(){
        //获取processEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取一个RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //得到流程定义查看对象ProcessDefinitionQuery
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //指定查看的流程   processDefinitionKey()指定流程定义的key值   orderByProcessDefinitionVersion根据流程定义版本号排序
        List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("myProcess_1").orderByProcessDefinitionVersion().desc().list();
        for (ProcessDefinition proDef:holiday) {
            System.out.println("流程定义ID:"+proDef.getId());
            System.out.println("流程定义的名称:"+proDef.getName());
            System.out.println("流程定义的Key:"+proDef.getKey());
            System.out.println("流程定义的版本号:"+proDef.getVersion());
        }
    }

 

 

 

三.流程删除

            /**
             * 删除流程:
             * 假设在删除时,当前正在有该流程实例执行,那么会导致删除失败
             * 如果强制要求,则可以使用repositoryService.deleteDeployment("1",true); true代表级联删除
             */
            @Test
            public void deleteDeployment(){
                //获取processEngine对象
                ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
                //获取一个RepositoryService对象
                RepositoryService repositoryService = processEngine.getRepositoryService();
                //删除流程
                repositoryService.deleteDeployment("1",true);
            }

 

 

 


        
四.获取数据库中流程资源信息

依赖:

 

    <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
          <version>2.5</version>
          <scope>test</scope>
      </dependency>

 

 

 

    /**
     * 从数据中读取资源文件到本地
     */
    @Test
    public void getResource() throws IOException {
        //获取processEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取一个RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //获取到流程查询对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //获取到流程资源
        processDefinitionQuery.processDefinitionKey("myProcess_1");
        //获取单一结果
        ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
        //流程部署的ID
        String deploymentId = processDefinition.getDeploymentId();
        //获取到bpmnResource
        InputStream bpmnStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
        //获取到png
        InputStream pngStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
        //构建输出流
        OutputStream bpmnOut = new FileOutputStream("E:\\Test\\" + processDefinition.getResourceName());
        OutputStream pngOut = new FileOutputStream("E:\\Test\\" + processDefinition.getDiagramResourceName());
        //将数据输出到磁盘当中
        IOUtils.copy(bpmnStream,bpmnOut);
        IOUtils.copy(pngStream,pngOut);
        //关流
        pngOut.close();
        bpmnOut.close();
        pngStream.close();
        bpmnStream.close();
    }

 

执行效果:

 

 

 

 


        
        
五.业务系统和流程系统进行关联

    /**
     * 启动流程实例和业务系统关联
     * 正常应该先添加数据到业务表当中,拿到当前添加数据的主键ID,通过启动流程实例,将主键ID交给BuessniessKkey
     * 代表和流程系统进行关联
     */
    @Test
    public void startInstance(){
        /**
         * 让张三在页面提交,然后拿到ID
         */


        /**
         * 创建张三请假的实例流程
         */
        //获取processEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //生成流程
        ProcessInstance holiday = runtimeService.startProcessInstanceByKey("myProcess_1","2");

        /**
         * 张三提交请假审批
         */
        //获取一个TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //获取张三的任务
        Task task = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("myProcess_1").singleResult();
        //任务审批
        taskService.complete(task.getId());
    }

 

 

 


        

六.流程激活和挂起

1.所有流程定义的挂起

    /**
     * 所有流程定义的挂起
     */
    @Test
    public void allSuspend(){
        //获取processEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取repositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //获取流程定义
        ProcessDefinition holiday = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess_1").singleResult();
        //获取到当前流程定义是否为暂停状态   suspended方法为true代表为暂停   false就是运行的
        boolean suspended = holiday.isSuspended();
        if(suspended){
            repositoryService.activateProcessDefinitionById(holiday.getId(),true,null);
            System.out.println("该流程定义激活");
        }else{
            repositoryService.suspendProcessDefinitionById(holiday.getId(),true,null);
            System.out.println("该流程定义暂停");
        }
    }

 

 

 再次执行

 

 

 

2.单个流程实例的挂起

    /**
     * 单个流程实例的挂起
     */
    @Test
    public void singleSuspend(){
        //获取processEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取RuntimeService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("22501").singleResult();
        //获取到当前流程定义是否为暂停状态   suspended方法为true代表为暂停   false就是运行的
        boolean suspended = processInstance.isSuspended();
        if(suspended){
            runtimeService.activateProcessInstanceById("22501");
            System.out.println("xx的请假流程激活");
        }else{
            runtimeService.suspendProcessInstanceById("22501");
            System.out.println("xx的请假流程挂起");
        }
    }

尝试处理挂起的流程

报出错误

 

 

 

 

 

 

posted @ 2020-04-02 16:46  怀鑫  阅读(999)  评论(0编辑  收藏  举报