美文网首页
流程引擎Camunda开发记录(二)上

流程引擎Camunda开发记录(二)上

作者: _花 | 来源:发表于2022-03-14 10:29 被阅读0次

    Camunda的使用有两种方法,一种是JAVA API,一种是RESET API
    个人理解JAVA API是从上到下通过JAVA类一级一级调用,RESET API则是从下到上通过注解+接口一层一层实现,如果你只是使用Camunda实现一些简单的操作,用JAVA API就能满足。

    1.如何部署流程?

        @Override
        public Deployment createDeployment(String path) throws IOException {
                File file = new File(path);
                // 文件发布 其中param 是文件的路径信息
                Deployment deploy = repositoryService.createDeployment().addInputStream("bpmnProcessId",
                        new FileInputStream(file)).deploy();
                return deploy;
    
        }
    

    流程定义中字段processDefinitionKey的值来自于bpmn文件中的id值,
    processDefinitionName来自于name值。
    <bpmn2:process id="loanApproval" name="Loan Approval" isExecutable="true">

    有时候我们需要在部署直接做一些校验,那么可以利用下面这个静态方法:BpmnModelInstance modelInstance = Bpmn.readModelFromStream(is)
    通过BpmnModelInstance我们可以做一些简单或者深入的判断,比如判断流程有没有结束事件:
    modelInstance.getModelElementsByType(EndEvent.class).isEmpty()
    判断启动任务有没有设置表单

    Collection startEvents = modelInstance.getModelElementsByType(StartEvent.class);
    
    for (StartEvent startEvent : startEvents) {
    
      Collection flows = startEvent.getIncoming();
    
      if (flows.isEmpty()) {
    
              if (StringUtils.isEmpty(startEvent.getCamundaFormKey()))  {
    
            //提醒用户设置启动表单
    
            }
        }
    }
    

    2.如何查看流程定义

    (1)查看单个流程

        @Override
        public CommonResult<Map> getProcessDefinitionById(String processDefinitionId){
            ProcessDefinition definition = repositoryService.getProcessDefinition(processDefinitionId);
            // 构建Map
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("result", definition);
            return CommonResult.success(data);
        }
    

    (2)查看流程定义列表

        @Override
        public CommonResult<Map> getProcesses(int currentPage, int pageSize){
    
            // 查询流程定义
            // 遍历查询结果
            PageHelper.startPage(currentPage, pageSize);
            //下面为链式调用
            List<ProcessDefinition> list =  repositoryService.createProcessDefinitionQuery()
                    .latestVersion()
                    .orderByProcessDefinitionVersion()
                    .asc()
                    .list();// 返回一个集合列表,封装流程定义  
    //      long count = repositoryService.createProcessDefinitionQuery().latestVersion().count();
            // 取分页结果
            PageInfo<ProcessDefinition> pageInfo = new PageInfo<>(list);
            // 取记录总数
            long total= pageInfo.getTotal();
            System.out.println(list);
            List<ProcessModel> processDefinitionList =new ArrayList<>();
            for(ProcessDefinition processDefinition:list){
                ProcessModel processDefinitionLike = new ProcessModel();
                processDefinitionLike.setDeploymentId(processDefinition.getDeploymentId());
                processDefinitionLike.setProcessDefinitionName(processDefinition.getName());
                processDefinitionLike.setProcessDefinitionVersion(processDefinition.getVersion());
                processDefinitionLike.setProcessDefinitionDescription(processDefinition.getDescription());
                processDefinitionLike.setProcessDefinitionKey(processDefinition.getKey());
                processDefinitionLike.setProcessDefinitionId(processDefinition.getId());
                processDefinitionLike.setProcessDefinitionResourceName(processDefinition.getResourceName());
                processDefinitionList.add(processDefinitionLike);
            }
            // 构建Map
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("result", processDefinitionList);
            data.put("total", total);
            data.put("currentPage", currentPage);
            return CommonResult.success(data);
    
        }
    

    流程定义key值相同的情况下,版本是从1开始逐次升级的,流程定义的id是【key:版本:生成ID】

    流程定义key值可以理解为,一个流程只有1个固定key值,你每修改一次流程定义,key值不变,但流程ID,版本号会改变,流程ID会重新生成,版本号会在之前基础上加1;

    .latestVersion()实际是通过key值对列表进行了过滤,只保留最后一版的流程定义。
    (3)获取流程定义的文件资源-XML

        @Override
        public CommonResult<Map> getProcessModel(String processDefinitionId){
    //        BpmnModelInstance bpmnModelInstance = repositoryService.getBpmnModelInstance(processDefinitionId);
            InputStream processModelIn = null;
            try {
                processModelIn = repositoryService.getProcessModel(processDefinitionId);
                byte[] processModel = IoUtil.readInputStream(processModelIn, "processModelBpmn20Xml");
                ProcessDefinitionDiagramDto processDefinitionDiagramDto = ProcessDefinitionDiagramDto
                        .create(processDefinitionId, new String(processModel, "UTF-8"));
                System.out.println(processDefinitionDiagramDto);
                Map<String, Object> data = new HashMap<String, Object>();
                data.put("bpmn20Xml", processDefinitionDiagramDto);
                data.put("id", processDefinitionId);
                return CommonResult.success(data);
            } catch (AuthorizationException e) {
                throw e;
            } catch (ProcessEngineException e) {
                throw new InvalidRequestException(Response.Status.BAD_REQUEST,
                        e, "No matching definition with id " + processDefinitionId);
            } catch (UnsupportedEncodingException e) {
                throw new RestException(Response.Status.INTERNAL_SERVER_ERROR, e);
            } finally {
                IoUtil.closeSilently(processModelIn);
            }
        }
    
    

    (4)获取流程

        public void viewPic() throws IOException {
            // 将生产的图片放到文件夹下
            String deploymentId = "401";// TODO
            // 获取图片资源名称
            List<String> list = processEngine.getRepositoryService()
                    .getDeploymentResourceNames(deploymentId);
     
            // 定义图片资源名称
            String resourceName = "";
            if (list != null && list.size() > 0) {
                for (String name : list) {
                    if (name.indexOf(".png") >= 0) {
                        resourceName = name;
                    }
                }
            }
     
            // 获取图片的输入流
            InputStream in = processEngine.getRepositoryService()
                    .getResourceAsStream(deploymentId, resourceName);
     
            File file = new File("D:/" + resourceName);
            // 将输入流的图片写到D盘下
            FileUtils.copyInputStreamToFile(in, file);
        }
    
    3.获取流程下活动实例的节点
        @Override
        public CommonResult<Map> getActivityStatistics(String processDefinitionId){
            List<ActivityStatistics> activityStatistics = managementService
                    .createActivityStatisticsQuery(processDefinitionId)
                    .list();
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("result", activityStatistics);
            return CommonResult.success(data);
    
        }
    
    

    4.获取流程下活动实例

        @Override
        public CommonResult<Map> getActiveInstances(String processDefinitionId){
            List<ProcessInstance> lists = runtimeService.createProcessInstanceQuery()
                    .active()
                    .processDefinitionId(processDefinitionId)
                    .orderByProcessInstanceId()
                    .asc()
                    .list();
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("result", lists);
            return CommonResult.success(data);
        }
    

    5.获取流程下失败实例

        @Override
        public CommonResult<Map> getIncidentByProcessId(String processDefinitionId){
            List<Incident> lists = runtimeService.createIncidentQuery()
                    .processDefinitionId(processDefinitionId)
                    .orderByIncidentId()
                    .asc()
                    .list();
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("result", lists);
            return CommonResult.success(data);
    
        }
    

    6.根据key删除所有版本流程定义

    public void deleteProcessDefinitionByKey() {
            String processDefinitionKey = "Flow_15kr3p7";
            List<ProcessDefinition> list = repositoryService
                    .createProcessDefinitionQuery()
                    .processDefinitionKey(processDefinitionKey)
                    .list();
            for (ProcessDefinition processDefinition : list)
            {
                repositoryService.deleteDeployment(processDefinition.getDeploymentId(), true);
                System.out.println("删除" + processDefinition.getDeploymentId());
    
            }
            System.out.println("删除成功");
        }
    

    相关文章

      网友评论

          本文标题:流程引擎Camunda开发记录(二)上

          本文链接:https://www.haomeiwen.com/subject/fudddrtx.html