工作流之Camunda开发记录(二)---- 用户任务、服务任务、全局变量的使用

前言

上篇文章我们简单介绍了工作流的发布与启动

直通车

这篇文章 我们介绍几种常用任务与全局变量的使用
全局变量会穿插在任务中介绍 不会单独列出来了奥

用户任务

用户任务 可以理解为我们常说的审批,工作流本身的意义在于自动执行某些业务逻辑,然而用户任务打断了所谓的自动,用户任务需要用户进行审批通过才能继续执行当前流程实例

既然是需要审批的 那么就需要一个审批人,这个审批人Camunda 本身是维护一个用户列表的 但是使用中肯定是不方便的,我看其他有些人是通过把自己的用户信息同步到Camunda自己的表中进行设置,这样肯定是不方便的。
所以我是通过在用户任务的逻辑来获取自己业务中的用户信息进行判断,我们还是把Camunda 想象成一个壳子,不参与任务业务逻辑的判断。

下面来看一下我是怎么做的

首先用户任务xml信息
<bpmn:userTask id=“usertask_1” name=“usertask111” camunda:assignee="#{demoTask.fun1(s1)}">
bpmn:incomingFlow_0u8v6zi</bpmn:incoming>
bpmn:outgoingFlow_1cjr3j9</bpmn:outgoing>
</bpmn:userTask>
其中Camunda:assignee 的意思是调用一个外部方法
这里的类是Spring容器中的类名 加上具体的方法名称即可,而且可以添加参数,这里的参数就是全局参数
我们一步步来
首先 看DemoTask类

@Component
public class DemoTask {
    public String fun1(String s1) {
        System.out.println("fun1 run " + s1);
        return s1;
    }
}

这里就提到了全局参数这个东西,全局参数贯穿工作流整体
首先在启动任务时可以设置全局参数 具体可以参考上一篇文章中的启动流程
直通车
我们在这里获取同名参数即可,他可以是一个对象 也可以是一个基本数据类型。

这里有一点需要注意的 就是如果想使用这个标签内属性,需要在xml头部添加信息,这里我列出我的所有xml头部信息,仅供参考

<bpmn:definitions xmlns:bpmn=“http://www.omg.org/spec/BPMN/20100524/MODEL”
xmlns:bpmndi=“http://www.omg.org/spec/BPMN/20100524/DI”
xmlns:dc=“http://www.omg.org/spec/DD/20100524/DC” xmlns:di=“http://www.omg.org/spec/DD/20100524/DI”
xmlns:camunda=“http://camunda.org/schema/1.0/bpmn” id=“Definitions_demo4”
targetNamespace=“http://bpmn.io/schema/bpmn” exporter=“Camunda Modeler” exporterVersion=“4.6.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://camunda.org/schema/1.0/bpmn”>

这样我们就可以通过全局变量传入我们自己的用户信息,在fun1()方法中进行判断,因为我不是这样实现的 所以仅供参考,另一种方法会在服务任务中一起介绍

服务任务与全局变量

我的业务逻辑中 需要服务任务做的东西很多,包括设置全局参数,调用脚本任务等等,虽然在前端时各种奇怪的任务类型,在后端只有一种任务类型 那就是服务任务,服务任务与用户任务最大的区别就是服务任务是自动执行的。
举例说明:
前端有三个节点信息,第一个节点设置全局参数,第二个节点调用脚本任务有输出信息,第三个也是调用脚本任务需要用到第一步的输入与第二步的输出,这里的交互主要就是通过全局参数实现的

首先

还是调用外部任务 上面的用户任务介绍了调用一个外部类的某一个方法,这个在服务任务也是可以使用的,但是有诸多不便,所以这里我们使用另一种方法,通过实现camunda内置的一个接口来实现
xml如下:

<bpmn:serviceTask id=“serviceTask_1” camunda:class=“com.xiangfu.core.workflow.DemoTask”>
bpmn:incomingFlow_136z0w9</bpmn:incoming>
bpmn:outgoingFlow_0d7jz10</bpmn:outgoing>
</bpmn:serviceTask>

这里的Camunda:class 后面的类是全路径
我们看一下这个类 升级了

@Component
public class DemoTask implements JavaDelegate, Serializable {

    @Autowired
    private HttpClientUtil httpClientUtil;

    public String fun1(String s1) {
        System.out.println("fun1 run " + s1);
        return s1;
    }

    public void fun2(String s2) {
        System.out.println("fun2 run " + s2);
    }

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        DemoParam s1 = (DemoParam)execution.getVariable("s1");
        ResponseEntity<String> stringResponseEntity = httpClientUtil.postRequest("https://api.apiopen.top/getJoke?page=1&count=2&type=video", "application/json", null, null);
        System.out.println(stringResponseEntity);
        s1.setName(stringResponseEntity.toString());

        execution.setVariable("1", true);
    }
}


@Component
public class DemoTask2 implements JavaDelegate, Serializable {

    public String fun1(String s1) {
        System.out.println("fun1 run " + s1);
        return s1;
    }

    public void fun2(String s2) {
        System.out.println("fun2 run " + s2);
    }

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        DemoParam s1 = (DemoParam)execution.getVariable("s1");
        System.out.println("----s1=" + s1);
    }
}

这里我也再放一下另一个类 因为他们俩是有交互,细心的朋友一眼应该就能看出来

我通过http请求在demo1中请求了一些信息并设置到全局变量中 ps:这个util就不外放了 若此url有侵犯到其他利益请与我沟通
在demo2中我通过全局变量信息取到了这个设置的信息
说的大一点就是可以在运行中 两个节点之间传递各自的信息,当然肯定是后面的节点拿前面节点的信息

这里需要实现一个javaDelegate接口
需要实现一个execute()方法
这个参数信息很好玩
需要的朋友可以自己玩一玩,他可以取到执行的定义id,实例id,当前任务id,包括在启动任务时设置的全局变量都可以取到 部分代码在下面 需要自取

// 处理参数 其中每个实例execution id 都是相同的
        Map<String, Object> variables = runtimeService.getVariables(execution.getId());
        // taskXmlId 查询task Variable
        String taskXmlId = ((ExecutionEntity) execution).getActivityId();
        String workflowId = variables.get(WORKFLOWID_STR).toString();

上面的代码variables这个映射就是整个流程实例的全局参数,通过id去判断时哪个实例设置的参数,所有的业务逻辑都在这个execute中实现。几乎不会用到工作流本身任何的业务信息 用户任务也是可以这样的使用的

这里我给一下完整的xml信息 仅供参考

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
                  xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
                  xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
                  xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_demo4"
                  targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.6.0"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://camunda.org/schema/1.0/bpmn">
    <bpmn:process id="Process_0cj7ee6" isExecutable="true">
        <bpmn:startEvent id="StartEvent_1">
            <bpmn:outgoing>Flow_136z0w9</bpmn:outgoing>
        </bpmn:startEvent>
        <bpmn:sequenceFlow id="Flow_136z0w9" sourceRef="StartEvent_1" targetRef="serviceTask_1" />
        <bpmn:serviceTask id="serviceTask_1" camunda:class="com.xiangfu.core.workflow.DemoTask">
            <bpmn:incoming>Flow_136z0w9</bpmn:incoming>
            <bpmn:outgoing>Flow_0d7jz10</bpmn:outgoing>
        </bpmn:serviceTask>
        <bpmn:exclusiveGateway id="Gateway_1ch9i3u">
            <bpmn:incoming>Flow_0d7jz10</bpmn:incoming>
            <bpmn:outgoing>Flow_00c78zu</bpmn:outgoing>
            <bpmn:outgoing>Flow_1clatpr</bpmn:outgoing>
        </bpmn:exclusiveGateway>
        <bpmn:sequenceFlow id="Flow_0d7jz10" sourceRef="serviceTask_1" targetRef="Gateway_1ch9i3u" />
        <bpmn:sequenceFlow id="Flow_00c78zu" sourceRef="Gateway_1ch9i3u" targetRef="Activity_0yg6kty">
            <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{s3&gt;1}</bpmn:conditionExpression>
        </bpmn:sequenceFlow>
        <bpmn:serviceTask id="Activity_0yg6kty" camunda:class="com.xiangfu.core.workflow.DemoTask2">
            <bpmn:incoming>Flow_00c78zu</bpmn:incoming>
        </bpmn:serviceTask>
        <bpmn:sequenceFlow id="Flow_1clatpr" sourceRef="Gateway_1ch9i3u" targetRef="Activity_0sl94zs">
            <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{true}</bpmn:conditionExpression>
        </bpmn:sequenceFlow>
        <bpmn:serviceTask id="Activity_0sl94zs" camunda:expression="#{demoTask.fun1(s1)}">
            <bpmn:incoming>Flow_1clatpr</bpmn:incoming>
        </bpmn:serviceTask>
    </bpmn:process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_1">
        <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_0cj7ee6">
            <bpmndi:BPMNEdge id="Flow_136z0w9_di" bpmnElement="Flow_136z0w9">
                <di:waypoint x="215" y="117" />
                <di:waypoint x="270" y="117" />
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge id="Flow_0d7jz10_di" bpmnElement="Flow_0d7jz10">
                <di:waypoint x="370" y="117" />
                <di:waypoint x="425" y="117" />
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge id="Flow_00c78zu_di" bpmnElement="Flow_00c78zu">
                <di:waypoint x="475" y="117" />
                <di:waypoint x="530" y="117" />
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge id="Flow_1clatpr_di" bpmnElement="Flow_1clatpr">
                <di:waypoint x="450" y="142" />
                <di:waypoint x="450" y="230" />
                <di:waypoint x="530" y="230" />
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
                <dc:Bounds x="179" y="99" width="36" height="36" />
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape id="Activity_1ksiteo_di" bpmnElement="serviceTask_1">
                <dc:Bounds x="270" y="77" width="100" height="80" />
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape id="Gateway_1ch9i3u_di" bpmnElement="Gateway_1ch9i3u" isMarkerVisible="true">
                <dc:Bounds x="425" y="92" width="50" height="50" />
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape id="Activity_0xjkxrd_di" bpmnElement="Activity_0yg6kty">
                <dc:Bounds x="530" y="77" width="100" height="80" />
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape id="Activity_02x1ews_di" bpmnElement="Activity_0sl94zs">
                <dc:Bounds x="530" y="190" width="100" height="80" />
            </bpmndi:BPMNShape>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</bpmn:definitions>

好了到这里服务任务与用户任务 包括全局变量的两种设置方法 也完事了
camunda 的基本日常使用也应该OK 了 如果有什么需要讨论的 欢迎留言分享

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值