Activiti工作流之RepositoryService常用接口方法详解
发布于 2018-11-29    1,262 次阅读
RepositoryService是 Activiti的核心API之一。常用于发布流程定义。下面列举若干常用方法。
本文为转载文章,原文链接:http://www.codedocs.net/blog/345

RepositoryService是 Activiti的核心API之一。常用于发布流程定义。下面列举若干常用方法。

一、根据流程key分页查询流程定义

    /**
     * 根据流程key分页查询流程定义
     * @param curPage
     * @param pageSize
     * @param definitionKey
     * @return
     */
    public Page<ProcessDefinition> queryProcessDefinition(Integer curPage,Integer pageSize,String definitionKey) {
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        processDefinitionQuery = processDefinitionQuery.processDefinitionKey(definitionKey);
        // 如果用流程定义ID则可用如下方法构建查询条件
        // processDefinitionQuery = processDefinitionQuery.processDefinitionId(definitionId.toString());
        // processDefinitionQuery = processDefinitionQuery.processDefinitionIds(...);
        processDefinitionQuery = processDefinitionQuery.orderByProcessDefinitionName().orderByProcessDefinitionVersion().asc();
        List<ProcessDefinition> processDefinitionList = processDefinitionQuery.listPage(curPage, pageSize);
//        for(ProcessDefinition processDefinition : processDefinitionList){
//            System.out.println("流程定义ID:"+processDefinition.getId());//流程定义的key+版本+随机生成数
//            System.out.println("流程定义名称:"+processDefinition.getName());//对应x.bpmn文件中的name属性值
//            System.out.println("流程定义的key:"+processDefinition.getKey());//对应x.bpmn文件中的id属性值
//            System.out.println("流程定义的版本:"+processDefinition.getVersion());//当流程定义的key值相同的情况下,版本升级,默认从1开始
//            System.out.println("资源名称bpmn文件:"+processDefinition.getResourceName());
//            System.out.println("资源名称png文件:"+processDefinition.getDiagramResourceName());
//            System.out.println("部署对象ID:"+processDefinition.getDeploymentId());
//        }
        Page<ProcessDefinition> page = new Page<ProcessDefinition>();
        page.setList(processDefinitionList);
        page.setTotalCount((int)processDefinitionQuery.count());
        page.setPageSize(pageSize);
        page.setCurrentPage(curPage);
        return page;
    }

 

二、上传流程压缩文件或者流程xml文件进行流程部署

    /**
     * 上传流程压缩文件或者流程xml文件进行流程部署
     * @param fileName
     * @param fileBytes
     */
    @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
    public void deploy(String fileName, byte[] fileBytes) {
        InputStream ByteArrayInputStream = new ByteArrayInputStream(fileBytes);
        String extension = FilenameUtils.getExtension(fileName);
        if (extension.equals("zip") || extension.equals("bar")) {
            ZipInputStream zip = new ZipInputStream(ByteArrayInputStream);
            repositoryService.createDeployment().addZipInputStream(zip).deploy();
        } else {
            repositoryService.createDeployment().addInputStream(fileName, ByteArrayInputStream).deploy();
        }
    }

 

三、删除某个流程部署

    /**
     * 删除某个流程部署
     * @param deploymentId
     */
    @Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
    public void deleteDeployment(String deploymentId){
        //Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
        if(processDefinition == null){
            throw new RuntimeException("deploymentId="+deploymentId + "的流程定义不存在");
        }
        
        // 先判断该流程关联的运行/已完成的实例
        // 运行中的实例
        int totalCount = (int)runtimeService.createProcessInstanceQuery().deploymentId(deploymentId).count();
        // 已完成的实例
        int historyCount = (int)historyService.createHistoricProcessInstanceQuery().deploymentId(deploymentId).count();
        if(totalCount > 0 || historyCount > 0){
            // 一般生产环境如果存在流程实例时,是不允许删除流程部署的
            throw new RuntimeException("该流程存在运行中/已完成的实例,请勿直接删除");
        }
        // 通常不能直接删除部署 原因 1:如果存在级联实例会一并删除(可先手动删除实例)   2:存在大量级联实例时删除会非常慢
        // 第二个参数如果设置为false,则不级联删除。可按需求制定逻辑
        repositoryService.deleteDeployment(deploymentId, true);
    }

 

四、根据流程定义ID激活某个流程

    /**
     * 根据流程定义ID激活某个流程
     * @param processDefinitionId
     */
    public void activateProcessDefinitionById(String processDefinitionId) {
        // 第二个参数true表示同步激活关联的流程实例
        this.repositoryService.activateProcessDefinitionById(processDefinitionId, true, null);
        // 以下是根据流程定义key激活
        // this.repositoryService.activateProcessDefinitionByKey(processDefinitionKey);
    }

 

五、根据流程定义ID挂起某个流程

    /**
     * 根据流程定义ID挂起某个流程
     * @param processDefinitionId
     */
    public void suspendProcessDefinitionById(String processDefinitionId) {
        // 第二个参数true表示同步挂起关联的流程实例
        this.repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null);
        // 以下是根据流程定义Key挂起
        // this.repositoryService.suspendProcessDefinitionByKey(processDefinitionKey);
    }

 

六、下载读取部署资源文件

    /**
     * 下载读取部署资源文件
     * @param processDefinitionId 流程定义ID
     * @param resourceType 资源类型(image/xml)
     * @return
     */
    public byte[] loadDeployment(String processDefinitionId, String resourceType) {
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
        String resourceName = "";
        if (resourceType.equals("image")) {
            resourceName = processDefinition.getDiagramResourceName();
        } else if (resourceType.equals("xml")) {
            resourceName = processDefinition.getResourceName();
        }
        InputStream resourceAsStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), resourceName);
        try {
            return IOUtils.toByteArray(resourceAsStream);
        } catch (Exception e) {
            logger.error("读取资源失败", e);
            return null;
        } finally {
            IOUtils.closeQuietly(resourceAsStream);
        }
    }

 

七、根据流程定义Key查询关联的所有版本

    public List<Integer> queryProcessDefinitionVersion(String processDefinitionKey) {
        List<Integer> versionList = new ArrayList<Integer>();
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(processDefinitionKey).orderByProcessDefinitionVersion().asc().list();
        if (list != null) {
            for (Object object : list) {
                ProcessDefinitionEntity procDef = (ProcessDefinitionEntity) object;
                versionList.add(procDef.getVersion());
            }
        }
        return versionList;
    }

 

八、根据流程部署ID查看流程图

    public byte[] viewImage(String deploymentId) throws Exception {
        byte[] imageBytes = null;
        // 从仓库中找需要展示的文件
        List<String> names = repositoryService.getDeploymentResourceNames(deploymentId);
        String imageName = null;
        for (String name : names) {
            if (name.indexOf(".png") >= 0) {
                imageName = name;
            }
        }
        if (imageName != null) {
            // 通过部署ID和文件名称得到文件的输入流
            InputStream in = repositoryService.getResourceAsStream(deploymentId, imageName);
            try {
                imageBytes = IOUtils.toByteArray(in);
            } catch (IOException e) {
                logger.error("读取资源失败", e);
            } finally {
                IOUtils.closeQuietly(in);
            }
        }
        return imageBytes;
    }

 

版权说明 : 本文为转载文章, 版权为原作者所有

原文标题 : Activiti工作流之RepositoryService常用接口方法详解

原文连接 : http://www.codedocs.net/blog/345


 主题目录

    欢迎关注本站公众号 开发小院