【Camunda八】Camunda网关

本文深入介绍了Camunda中的四种网关:排他网关、并行网关、包容性网关和基于事件的网关,重点解析了排他网关的工作原理及使用。通过代码示例展示了如何在流程中使用排他网关,并演示了流程分支和驳回的操作。同时,提醒注意在建模时应设置合理的默认流。
摘要由CSDN通过智能技术生成

一、什么是网关

所谓“网关”就是用来决定流程流转指向的,可能会被用作条件分支或聚合,也可以被用作并行执行或基于事件的排它性条件判断网关用菱形表示,用于控制流程的分支和聚合。

Camunda提供了四种网关:排他网关、并行网关、包容性网关、基于事件的网关。

二、排他网关

流程执行到该网关时,按照输出流的顺序逐个计算,当条件的计算结果为true时,继续执行当前网关的输出流;如果多条线路计算结果都是 true,则会执行第一个值为 true 的线路。如果所有网关计算结果没有true,则引擎会抛出异常。

排他网关需要和条件顺序流【也就是图上的连线】结合使用,default 属性指定默认顺序流,当所有的条件不满足时会执行默认顺序流。

三、测试

然后部署流程定义再发起流程实例测试一下,在启动流程时把参数值都给到位,正常情况下是在申请人发起申请后才给序列流上的条件给值

    public ResultReturn startProcessInstanceByKey(String processDefinitionKey, String businessKey,String initiator) {
        try {
            Map<String,Object> map = new HashMap<>();
           //设置流程发起人
            identityService.setAuthenticatedUserId("initiator");
            map.put("userOne",initiator);
            map.put("day",4);
            map.put("minister","userTwo");
            map.put("manager","userThree");
            ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey,map);
           if (ObjectUtil.isNull(processInstance)) {
               return ResultReturnUtil.error(ResponseEnums.PROCESS_INSTANCE_START_FAIL);
           } else {
               String processInstanceId = processInstance.getProcessInstanceId();
               return ResultReturnUtil.success(processInstanceId);
           }
       }catch (Exception e){
           log.error(e.getMessage());
           throw new ProcessException(ResponseEnums.PROCESS_INSTANCE_START_FAIL.getMsg());
       }
    }
}

从图中可以看到发起人提交申请后,流程走了上半部分

 四、分支驳回

 到这里如果领导驳回了该怎么做?驳回也就是让流程从某个节点重新开始,我们直接上代码

    @Override
    public ResultReturn startNode(String processInstanceId,String nodeId) {
        //获取当前环节实例
        ActivityInstance activity = runtimeService.getActivityInstance(processInstanceId);
        runtimeService.createProcessInstanceModification(processInstanceId)
                //关闭相关任务
                .cancelActivityInstance(activity.getId())
                .setAnnotation("驳回")
                //启动目标活动节点
                .startBeforeActivity(nodeId)
                .execute();
        return ResultReturnUtil.success("成功");
    }

 传入流程实例id和目标节点id即可

 查看流程图,已经回到发起人节点

 其实后台会出现一段提示

 意思也就是没有默认流,是不好的建模,直接修改流程图选定一条默认流即可。

查看流程历史也是很好区分的

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoneWalker、

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值