Springboot集成Camunda并完成一条流程实例

💖专栏简介

✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。

✔️文章中只包含演示核心代码及测试数据,完整代码可查看作者的开源项目snail-camunda

✔️请给snail-camunda 点颗星吧😘

💖设计流程定义

在Modeler中设计一个简单的流程定义

<?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:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0o0413o" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.19.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
  <bpmn:process id="Process_1pobt6o" isExecutable="true">
    <bpmn:startEvent id="StartEvent_1">
      <bpmn:outgoing>Flow_1k7cbz8</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="Flow_1k7cbz8" sourceRef="StartEvent_1" targetRef="root" />
    <bpmn:userTask id="root" name="发起人" camunda:assignee="${initiator}">
      <bpmn:incoming>Flow_1k7cbz8</bpmn:incoming>
      <bpmn:outgoing>Flow_1qx1hmd</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:sequenceFlow id="Flow_1qx1hmd" sourceRef="root" targetRef="Activity_1kwa01y" />
    <bpmn:userTask id="Activity_1kwa01y" name="经理" camunda:assignee="${manager}">
      <bpmn:incoming>Flow_1qx1hmd</bpmn:incoming>
      <bpmn:outgoing>Flow_1rx0p95</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:endEvent id="Event_0es4idv">
      <bpmn:incoming>Flow_1rx0p95</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_1rx0p95" sourceRef="Activity_1kwa01y" targetRef="Event_0es4idv" />
  </bpmn:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1pobt6o">
      <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_1sk7cxf_di" bpmnElement="root">
        <dc:Bounds x="270" y="77" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1rko3sb_di" bpmnElement="Activity_1kwa01y">
        <dc:Bounds x="430" y="77" width="100" height="80" />
        <bpmndi:BPMNLabel />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_0es4idv_di" bpmnElement="Event_0es4idv">
        <dc:Bounds x="592" y="99" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="Flow_1k7cbz8_di" bpmnElement="Flow_1k7cbz8">
        <di:waypoint x="215" y="117" />
        <di:waypoint x="270" y="117" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1qx1hmd_di" bpmnElement="Flow_1qx1hmd">
        <di:waypoint x="370" y="117" />
        <di:waypoint x="430" y="117" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1rx0p95_di" bpmnElement="Flow_1rx0p95">
        <di:waypoint x="530" y="117" />
        <di:waypoint x="592" y="117" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

这种是最简单的用户任务节点,该节点只允许分配一个任务给用户。

💖版本兼容

以下为版本对应表,本专栏所有案例基于Camunda 7.19.0+Spring Boot 2.7.7

Spring Boot Starter version

Camunda Platform version

Spring Boot version

7.13.x
7.13.3+***

7.13.x
7.13.3+

2.2.x.RELEASE
2.3.x.RELEASE

7.14.x
7.14.2+***

7.14.x
7.14.2+

2.3.x.RELEASE
2.4.x

7.15.x
7.15.3+***

7.15.x
7.15.3+

2.4.x
2.5.x

7.16.x
7.16.3+***

7.16.x
7.16.3+

2.5.x
2.6.x

7.17.x
7.17.2+***

7.17.x
7.17.2+

2.6.x
2.7.x

7.18.x
7.19.x

7.18.x
7.19.x

2.7.x

7.20.x

7.20.x

3.1.x

💖创建项目

新建SpringBoot项目后引入相关的场景启动器

<dependency>
  <groupId>org.camunda.bpm.springboot</groupId>
  <artifactId>camunda-bpm-spring-boot-starter</artifactId>
  <version>7.19.0</version>
</dependency>

<dependency>
  <groupId>org.camunda.bpm.springboot</groupId>
  <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
  <version>7.19.0</version>
</dependency>
        
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>

在properties或yml文件中进行相关属性值配置

###数据源相关配置
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root

###Camunda相关配置
#关闭自动部署
camunda.bpm.auto-deployment-enabled=false
camunda.bpm.history-level=full
camunda.bpm.admin-user.id=demo
camunda.bpm.admin-user.password=demo
camunda.bpm.admin-user.first-name=demo
camunda.bpm.filter.create=All tasks

Camunda的自动部署路径是【classpath*:**/*.bpmn20.xml 】,所以我们在resources目录下新建名称为bpmn的文件夹,用于放置设计的流程定义。

之后按照部署流程定义、发起流程实例、完成任务的顺序来完成。为方便演示,这里省略分层,代码在Controller中完成。

/**
 * 流程定义相关接口
 * @author lonewalker
 */
@RequestMapping("/process/definition")
@AllArgsConstructor
@RestController
public class ProcessDefinitionController {

    private final RepositoryService repositoryService;

    /**
     * 部署流程定义
     *
     * @return 提示信息
     */
    @PostMapping("/deploy")
    public String deployProcessDefinition(){
        repositoryService.createDeployment()
                .addClasspathResource("bpmn/1.bpmn")
                .name("演示")
                .deploy();
        return "部署成功";
    }
}

/**
 * 流程实例相关接口
 *
 * @author lonewalker
 */
@RequestMapping("/process/instance")
@RequiredArgsConstructor
@RestController
public class ProcessInstanceController {

    private final RuntimeService runtimeService;

    private final TaskService taskService;

    /**
     * 根据流程定义key发起流程实例
     *
     * @param requestParam 请求参数
     * @return 流程实例id
     */
    @PostMapping("/startProcessInstanceByKey")
    public String startProcessInstanceByKey(@RequestBody StartProcessRequest requestParam) {
        Map<String, Object> paramMap = new HashMap<>(4);
        paramMap.put("initiator", "10086");
        paramMap.put("manager", "10087");

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(requestParam.getProcessDefinitionKey(), requestParam.getBusinessKey(), paramMap);
        return processInstance.getProcessInstanceId();
    }

    /**
     * 完成单个任务
     *
     * @param requestParam 请求参数
     * @return 任务所在节点信息
     */
    @PostMapping("/completeSingleTask")
    public Boolean completeSingleTask(@RequestBody @Validated CompleteTaskRequest requestParam) {
        taskService.complete(requestParam.getTaskId());
        return true;
    }
}

发起流程实例的参数类,这里省略了get、set方法,大家可以使用lombok

/**
 * @author lonewalker
 */
@Data
public class StartProcessRequest {

    /**
     * 流程定义key
     */
    private String processDefinitionKey;
    /**
     * 业务key
     */
    private String businessKey;
    /**
     * 发起人
     */
    private String initiator;
}

完成待办任务的参数类

/**
 * @author lonewalker
 */
@Data
public class CompleteTaskRequest {

    @NotBlank(message = "流程实例id不能为空")
    private String processInstanceId;

    @NotBlank(message = "任务id不能为空")
    private String taskId;

}

💖测试接口

启动项目后会自动生成49张表

访问localhost:端口号 可以看到camunda的webapp页面,输入配置的账号、密码

调用部署接口后,来到驾驶舱中可以看到已经部署成功。

紧接着发起流程实例,所需的processDefinitionKey参数,也就是bpmn文件中的id。当然你从驾驶舱中也可以获取到。

调用接口后,可以从驾驶舱流程实例详情页面获取Task ID

将所有待办任务依次审批即可,流程实例结束后在驾驶舱是无法查看的:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/372334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

测试开发体系

软件测试 通过手工或者工具对 “被测对象”进行测试验证实际结果与预期结果之间是否存在差异 软件测试作用 通过测试工作可以发现并修复软件当中存在的缺陷&#xff0c;从而提高用户对产品的使用信心测试可以降低同类型产品开发遇到问题的风险 软件缺陷 软件缺陷被测试工程…

船舶维保管理:Java与SpringBoot的完美结合

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Linux openKylin(开放麒麟)系统SSH服务安装配置与公网远程连接

文章目录 前言1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接6. 固定SSH公网地址7. SSH固定地址连接8. 结语 前言 openKylin是中国首个基于Linux 的桌面操作系统开发者平台&#xff0c;通过开放操作系统源代码的方式&#xff…

在工业制造方面,如何更好地实现数字化转型?

实现工业制造的数字化转型涉及利用数字技术来增强流程、提高效率并推动创新。以下是工业制造领域更好实现数字化转型的几个关键步骤&#xff1a; 1.定义明确的目标&#xff1a; 清楚地概述您的数字化转型目标。确定需要改进的领域&#xff0c;例如运营效率、产品质量或供应链…

【vue ezuikit-js】5分钟实现萤石视频放大对焦和缩小对焦

实现功能如上图:点击+按钮,实现画面放大并对焦;点击-,实现画面缩小并对焦。 官网上提供了电子放大的控制按钮和接口,但是只是把当前画面进行放大,并没有对焦,画面模糊。 萤石官方还提供了对焦的接口,根据传入的参数不同,可以实现放大对焦和缩小对焦。但是注意此接口是…

【Matplotlib】figure方法 你真的会了吗!?

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;matplotlib &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

mysql项目实战,常用sql语句的实战笔记

1.使用sql语句对数据库进行创建 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20) NOT NULL COMMENT 学生姓名,ssex VARCHAR(10) NOT NULL…

基于Java超市管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

c++入门学习④——对象的初始化和清理

目录 对象的初始化和清理&#xff1a; why? 如何进行初始化和清理呢&#xff1f; 使用构造函数和析构函数​编辑 构造函数语法: 析构函数语法: 构造函数的分类&#xff1a; 两种分类方式&#xff1a; 三种调用方法&#xff1a; 括号法&#xff08;默认构造函数调用&…

sql非查询知识点(增删改-crud没有r)

1.建库 create database database_name 2.使用该数据库 use database_name 3.建表 3.1普通建表 create table if not exists actor(actor_id smallint(5) not null primary key comment "主键id",first_name varchar(45) not null comment "名字",last…

Python中的while循环,知其然知其所以然

文章目录 while循环结构1.用循环打印1 ~ 100步骤解析2. 1 ~ 100的累加和3.死循环1. 用死循环的方法实现 1 ~ 100累加和 4. 单向循环(1)打印 一行十个小星星*(2)通过打印一个变量的形式,展现一行十个小星星(3)一行十个换色的星星 ★☆★☆★☆★☆★☆(4)用一个循环,打印十行十列…

重写Sylar基于协程的服务器(7、TcpServer HttpServer的设计与实现)

重写Sylar基于协程的服务器&#xff08;7、TcpServer & HttpServer的设计与实现&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务…

『运维备忘录』之 Vim 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

杨中科 ASP.NETCORE 高级14 SignalR

1、什么是websocket、SignalR 服务器向客户端发送数据 1、需求&#xff1a;Web聊天;站内沟通。 2、传统HTTP&#xff1a;只能客户端主动发送请求 3、传统方案&#xff1a;长轮询&#xff08;Long Polling&#xff09;。缺点是&#xff1f;&#xff08;1.客户端发送请求后&…

如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏

文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 本教程主要介…

1802907-91-0,Methyltetrazine-PEG4-COOH,可以与多种不同的化学基团反应

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Methyltetrazine-PEG4-COOH&#xff0c;Methyltetrazine-PEG4-acid&#xff0c;甲基四嗪-四聚乙二醇-羧基&#xff0c;甲基四嗪-四聚乙二醇-羧酸&#xff0c;甲基四嗪PEG4羧酸&#xff0c;甲基四嗪-PEG4-羧酸 一、基…

基于Java医院管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

爱快安装和双宽带叠加

文章目录 一、爱快安装二、爱快使用1. 配置WAN12. 配置WAN23. 配置LAN14. 配置DHCP5. DNS设置6. 多线负载7. 基础设置 三、通过交换机拨号1. 交换机设置2. 配置WAN1 一、爱快安装 &#xff08;1&#xff09;下载爱快路由ISO版本 爱快路由系统下载 &#xff08;2&#xff09;IS…

群晖NAS开启FTP服务结合内网穿透实现公网远程访问本地服务

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP…

请问CTF是什么?请介绍一下关于隐水印的知识特点技术原理应用领域技术挑战

目录 请问CTF是什么&#xff1f; 请介绍一下关于隐水印的知识 特点 技术原理 应用领域 技术挑战 请问CTF是什么&#xff1f; CTF&#xff08;Capture The Flag&#xff0c;夺旗比赛&#xff09;是一种信息安全竞赛&#xff0c;常见于计算机安全领域。这种比赛模拟各种信…