• 工作流Camunda入门demo


    准备工作

    先下载2个客户端,分别是Camunda Platform和Camunda Modeler

    Camunda Platform是用来部署的
    Camunda Modeler是用来设计流程的

    具体的流程里的实际动作还是需要我们自己写代码去订阅实现的。

    直接上官网的2个下载地址,下载后不需要配置环境变量直接就能run,我这边本地pc是windows的所以下载了windows的,运行步骤可以直接看官网文档

    Camunda Platform
    https://camunda.com/download/

    平台登录默认账密
    demo/demo
    在这里插入图片描述

    Camunda Modeler
    https://camunda.com/download/modeler/
    在这里插入图片描述

    camunda中几个关键的层次关系

    • 流程定义 (Process Definition): 流程定义是对业务流程的蓝图或模板,它是静态的,按照BPMN 2.0规范进行建模。
    • 流程实例 (Process Instance):
      当流程定义被部署并且启动时,就会创建一个流程实例。流程实例是流程定义的一个具体运行时实例,它反映了流程从开始到结束的实际执行路径和状态。
    • 任务 (Tasks) 和 任务实例 (Task Instances): 在流程定义中,可以定义各种类型的用户任务、服务任务、脚本任务等。
      每当流程实例到达流程中的某个用户任务节点时,流程引擎会根据流程模型的配置创建对应的任务实例。
      任务实例具有生命周期,可以被创建、分配给参与者、完成或取消等。 多个任务实例之间可能存在层次关系,例如:
      序列关系:在一个串行流程中,任务A完成后才会触发任务B的创建,这时任务A和任务B存在前后顺序的层次关系。
      并行关系:在并行网关处分支的情况下,可能会同时创建多个任务实例,这些任务实例间是并发执行的并行层次关系。 嵌套子流程
      (Subprocesses):
      子流程也是一个流程实例,它可以有自己的用户任务。在这种情况下,子流程内部的任务实例与父流程实例之间形成嵌套层次关系。
    • 多实例 (Multi-instance Tasks): Camunda
      BPMN支持任务的多实例特性,允许单个任务节点生成多个实例,例如需要多位员工共同签署的会签任务,每个待签署的个体都会有一个独立的任务实例。

    简单设计一个流程

    在2者启动之后,打开modler开始demo制造。

    双击开始圆圈节点,起个名字,然后鼠标左点击后选择Append task(空白矩形),然后也是双击起个名字,之后点击Append task后选择change type改成service task,最后增加一个end节点。

    接着在service task里的Implementation中修改类型为External,给topic起个名字,这个topic名字就是一会我们需要在代码里订阅的。

    最后就是部署,然后启动我们的代码。用postman抛个demo数据过去看能不能接收到。

    下面用图片描述下上面的流程

    1-新建文件

    官网用的文档也是这个version 7的,所以我这里就直接创建版本7的了

    在这里插入图片描述

    2命名开始节点
    在这里插入图片描述

    3-创建一个任务并命名

    在这里插入图片描述

    4-修改任务为service task
    在这里插入图片描述

    5-追加结束节点并命名
    在这里插入图片描述

    6-修改刚创建的task类型

    在这里插入图片描述

    7-自定义代码订阅任务节点内容

    我这边使用的java
    导入依赖

    <dependency>
            <groupId>org.camunda.bpmgroupId>
            <artifactId>camunda-external-task-clientartifactId>
            <version>7.15.0version>
        dependency>
        <dependency>
            <groupId>org.slf4jgroupId>
            <artifactId>slf4j-simpleartifactId>
            <version>1.6.1version>
        dependency>
        <dependency>
            <groupId>javax.xml.bindgroupId>
            <artifactId>jaxb-apiartifactId>
            <version>2.3.1version>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    直接运行下面这段代码

    package com.fchan.worker;
    
    import org.camunda.bpm.client.ExternalTaskClient;
    
    import java.awt.*;
    import java.net.URI;
    import java.util.logging.Logger;
    
    /**
     * ClassName: ChargeCardWorker
     * Description:
     * date: 2022/11/11 10:18
     *
     * @author fchen
     */
    public class ChargeCardWorker {
    
        private final static Logger LOGGER = Logger.getLogger(ChargeCardWorker.class.getName());
    
        public static void main(String[] args) {
            ExternalTaskClient client = ExternalTaskClient.create()
                    .baseUrl("http://localhost:8080/engine-rest")
                    .asyncResponseTimeout(10000) // 长轮询超时时间
                    .build();
    
            // 订阅指定的外部任务,task的topic
            client.subscribe("task_demo")
                    .lockDuration(1000) // 默认锁定时间为20秒,这里修改为1秒
                    .handler((externalTask, externalTaskService) -> {
                        // 将您的业务逻辑写在这
    
                        // 获取流程变量
                        String item = (String) externalTask.getVariable("item");
                        Long amount = (Long) externalTask.getVariable("amount");
    
                        LOGGER.info("Charging credit card with an amount of '" + amount + "'€ for the item '" + item + "'...");
    
                        try {
                            Desktop.getDesktop().browse(new URI("https://docs.camunda.org/get-started/quick-start/complete"));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
    
                        // 完成任务
                        externalTaskService.complete(externalTask);
                    })
                    .open();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    8-部署流程

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    9-测试

    post请求
    http://localhost:8080/engine-rest/process-definition/key/Process_0d1kgby/start

    Process_0d1kgby就是刚刚我们流程的id

    body内容可以自定义,和我们代码对上即可

    {
        "variables": {
            "amount": {
                "value": 555,
                "type": "long"
            },
            "item": {
                "value": "item-xyz"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    测试成功
    在这里插入图片描述

  • 相关阅读:
    【26】c++设计模式——>命令模式
    所谓的模糊「互联网」和「金融」两种元素的做法,不过是一个梦想罢了
    【2024秋招】腾讯云智武汉后端开发一面 2023-9-20
    Apache Doris 1.1 特性揭秘:Flink 实时写入如何兼顾高吞吐和低延时
    基于javaweb的个人投资理财系统(java+springboot+layui+html+mysql)
    设计模式-抽象工厂模式
    openGauss向量化Merge Join--inner join
    JavaSE进阶之(十)Map 子接口之 ConcurrentHashMap
    FTP客户端lftp
    Mysql集群及高可用-多主复制(高可用)与Mysql路由(读写分离)8
  • 原文地址:https://blog.csdn.net/weixin_43944305/article/details/127801907