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

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("删除成功");
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容