Spring Boot 整合 Camunda 实现工作流

工作流是我们开发企业应用几乎必备的一项功能,工作流引擎发展至今已经有非常多的产品。最近正好在接触Camunda,所以来做个简单的入门整合介绍。如果您也刚好在调研或者刚开始计划接入,希望本文对您有所帮助。如果您是一名Java开发或Spring框架爱好者,欢迎关注我,持续更新技术干货。

Camunda简介

Camunda是一个灵活的工作流和流程自动化框架。其核心是一个运行在Java虚拟机内部的原生BPMN 2.0流程引擎。它可以嵌入到任何Java应用程序和任何运行时容器中。

  • 官网网站: https://www.camunda.org/

  • 入门文档: Getting started with Camunda Platform | docs.camunda.org

动手整合Camunda

下面就来一步步动手尝试一下吧。

准备工作

  1. 使用Camunda提供的项目初始化工具Camunda Automation Platform 7 Initializr

如上图,包名之类的根据自己需要做好配置,最后输入管理账号和密码,点击Generate Project按钮,自动下载工程。

  1. 解压下载后的工程,使用IntelliJ IDEA打开,其项目结构

  1. 打开pom.xml文件,添加camunda依赖:

<dependency>
    <groupId>org.camunda.connect</groupId>
    <artifactId>camunda-connect-core</artifactId>
</dependency>

<dependency>
    <groupId>org.camunda.bpm</groupId>
    <artifactId>camunda-engine-plugin-connect</artifactId>
</dependency>

由于Camunda Automation Platform 7 Initializr默认的Spring Boot版本已经是3.1了,所以如果要做一些降级调整,可以手工修改pom.xmldependencyManagement配置,比如下面这样:

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.6.4</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>org.camunda.bpm</groupId>
        <artifactId>camunda-bom</artifactId>
        <version>7.15.0</version>
        <scope>import</scope>
        <type>pom</type>
      </dependency>
    </dependencies>
</dependencyManagement>

  1. 打开配置文件application.yaml,可以看到类似下面的内容

spring.datasource.url: jdbc:h2:file:./camunda-h2-database

camunda.bpm.admin-user:
  id: transduck
  password: 111111、

  • spring.datasource.url:工作流引擎使用的数据库配置,您也可以根据官网文档去调整到其他数据库中(尤其生产环境)。

  • camunda.bpm.admin-user:管理员账户配置,可以在这里修改用户名和密码

创建一个简单的工作流

下面我们尝试创建一个简单的工作流:

第一步,我们将请求用户提供两个输入:name和message第二步,我们将这些输入传递给我们的服务以创建消息输出

开始编码:

  1. 创建第一步提到的数据模型

public class model {
    
    private String message;
    private String name;
    
    public model() { }
    
    public String getMessage() {
        return message;
    }
    
    public void setMessage(String message) {
        this.message = message;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "" + message + ", " + name;
    }
}

  1. 根据第二步,创建接收消息的接口

@RequestMapping("/")
@RestController
public class controller {

    Logger logger = Logger.getLogger(this.getClass().getName());

    @PostMapping("/message")
    public model createMessage(@RequestBody model model) {
        logger.info("-------Message Creator Initialized-------");

        model m = new model();
        m.setMessage(model.getMessage());
        m.setName(model.getName());

        logger.info("Message created --> " + m.toString());
        return m;
    }
}

  1. 下面我们可以开始创建工作流程图。在Camunda Modeler中打开我们项目的resources下的process.bpmn,我们将看到类似下面的流程图:

图中带有小人的框称为User Tasks,是执行与用户相关的操作的步骤。如前面部分所述,在工作流程的第一步中,我们将请求用户输入两个输入:姓名和消息。无需添加新任务,更新现有的User Tasks即可解决问题。单击User Tasks,打开属性面板,在打开的面板中定义适合我们案例内容。

  1. 完成基本信息填写后,转到Form选项卡。

这是定义呈现给用户的表单选项卡。由于我们需要用户输入姓名和消息,因此我们定义两个名为“name”和“message”的表单字段。要定义表单字段,请单击“表单字段”旁边的加号图标。在打开的表单中,相应地填写 ID、类型和标签字段。对每个表单字段重复相同的步骤。

  1. 开始配置第二步,调用我们的接口。添加Service Task

具体操作方法:单击左侧菜单中的Create Task图标,然后将任务拖放到随机位置。单击任务后,单击Change Type图标,然后从菜单中选择Service Task

  1. 填写基本信息

  1. 切换到Connector选项卡。这是定义 HTTP 信息和有关服务的数据的选项卡,在这里配置刚才定义的接口,具体如下图所示:

  1. Service Task连接到工作流程中。先删除User TasksEnd Event之间的箭头。然后,单击User Tasks并从菜单中选择箭头图标。将箭头连接到Service Task。最后,再连接Service TaskEnd Event

启动测试

在完成了上面的编码和工作流程配置后,我们就可以在调试模式下运行项目了。

启动完成后,在浏览器上访问地址http://localhost:8080/,您将看到 Camunda 登录页面:

输入您在application.yaml中配置的管理员配置信息,进入后台:

从应用程序主页中选择Tasklist,可看到如下界面:

然后在任务列表页面上单击Add a simple filter选项。单击后,您将看到名为All Tasks (0)的过滤器已添加到列表中,继续单击Start process选项来运行我们准备好的工作流程。

选择您的工作流进程,然后单击Start button,无需提供任何其他信息。

最后,单击Created下列出的Get Input任务。如果您没有看到该任务,请刷新页面。

您将看到我们在第一步中定义的表单。要填写表格,请单击右上角Claim选项。然后,根据您的喜好填写表格并单击Complete按钮。

当工作流执行Service Task并且服务运行时,您将看到列表再次变空。如果工作流成功执行了第二步,我们应该能够在控制台中看到输出。

文章转载自:程序猿DD

原文链接:https://www.cnblogs.com/didispace/p/17971567

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

【C++ 自写String】

CString.hpp #include <iostream> #include <string.h>#pragma warning(disable:4996) using namespace std;class CString { private:int len;char* data;public:CString():data(nullptr),len(0) {cout << "0空构造\n";}CString(const char* _da…

爬取咚漫漫画

一、数据来源分析1.确定自己的需求&#xff1a;采集哪个网站的上面的数据内容正常的访问流程&#xff1a;1.选中漫画--->目录页面 &#xff08;请求列表页面&#xff0c;获取所有的章节链接&#xff09;2.选择一个漫画内容--->漫画页面 &#xff08;请求章节链接&#xf…

Java简单程序设计

前言 Java简单的程序设计实验&#xff0c;分享记录一下。 程序题目及实现 1. 输入一个整数&#xff0c;判断是奇数还是偶数。 package java_1022;import java.util.Scanner;public class java01 {public static void main(String[] args) {int num;Scanner in new Scanner…

[计算机提升] 切换(域)用户

4.14 切换(域)用户 4.14.1 为什么要切换用户 在Windows系统中&#xff0c;切换用户的主要目的是为了实现多用户共享同一台计算机的便利和安全。当多个人需要使用同一台计算机时&#xff0c;每个人可以登录自己的用户账户&#xff0c;这样可以避免互相干扰和混淆数据。 以下是…

算法基础学习|双指针算法

双指针算法 代码模板 for (int i 0, j 0; i < n; i ){while (j < i && check(i, j)) j ;// 具体问题的逻辑 } 常见问题分类&#xff1a;(1) 对于一个序列&#xff0c;用两个指针维护一段区间(2) 对于两个序列&#xff0c;维护某种次序&#xff0c;比如归并…

数据结构之最优二叉树

数据结构之最优二叉树 1、最优二叉树2、哈夫曼编码 数据结构是程序设计的重要基础&#xff0c;它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发&#xff0c;分析和研究计算机加工的数据的特性&#xff0c;以便为应用所涉及的数…

分辨率 时钟频率 lane速率计算

PCLK: pixel clock(像素频率) 计算方法如下&#xff1a; 以1920x1080p/60hz为例&#xff0c;total pixel&#xff1a;2200&#xff0c;total line&#xff1a;1125&#xff0c;filed rate&#xff1a;60Hz&#xff0c;那么&#xff1a;PCLK 2200*1125*60 148.5MHz&#xff1b…

Vue-35、Vue中使用ref属性

1、ref属性 2、代码 <template><div id"app"> <!-- <img alt"Vue logo" src"./assets/logo.png">--><h1 v-text"msg" ref"title"></h1><button click"showDOM" ref&…

gdzwfw某省公共资源交易平台逆向学习

声明&#xff1a;本文中网站仅为学习技术使用&#xff0c;请勿暴力爬取数据。 学习地址&#xff1a;aHR0cHM6Ly95Z3AuZ2R6d2Z3Lmdvdi5jbi8jLzQ0L2p5Z2c 此网站采用请求头反爬&#xff0c;难点是请求头中几个参数是如何生成的&#xff08;别问为什么知道是请求头&#xff0c;一…

推荐系统算法 协同过滤算法详解(二)皮尔森相关系数

目录 前言 协同过滤算法(简称CF) 皮尔森(pearson)相关系数公式 算法介绍 算法示例1&#xff1a; 算法示例2 前言 理解吧同胞们&#xff0c;实在是没办发把wps公式复制到文章上&#xff0c;只能截图了&#xff0c;我服了&#xff01;&#xff01;&#xff01; 协同过滤算法…

pytestallure分析redis的数据并动态生成testCase报告

1.pytest.mark.parametrize pytest.mark.parametrize 是一个pytest的装饰器&#xff0c;它可以用于将参数传递给测试函数。使用 pytest.mark.parametrize 装饰器时&#xff0c;需要在装饰器中指定参数名称和参数值。对于多个参数&#xff0c;可以使用多个装饰器。 下面是一些…

ZXing开源库生成二维码

引言 二维码&#xff08;QR Code&#xff09;作为一种快速、高容量、高密度的矩阵条码&#xff0c;已经在各行各业得到广泛应用。ZXing&#xff08;Zebra Crossing&#xff09;是一款由Google开源的Java二维码生成和解析库&#xff0c;提供了丰富的功能和易于使用的API。本篇博…

sqlmap使用教程(5)-信息获取

MySQL数据库 -b&#xff0c;用来获取数据库标识 --hostname&#xff0c;可以获取数据库服务器的主机名 -current-user&#xff0c;用来获取当前连接数据库的用户名 --users&#xff0c;获取数据库管理系统中的所有用户 --passwords&#xff0c;可以获取数据库用户密码的哈希值…

接口文档管理工具(yapi的使用)

文章目录 一、API管理工具二、yapi 接口管理工具功能权限管理项目管理页面功能接口接口创建接口配置管理界面 动态成员管理数据管理设置 三、 docker安装yapi三、使用流程四、参考 一、API管理工具 [推荐-官方描述]使用 YApi 管理 API 文档&#xff0c;测试&#xff0c; mock …

【C++干货铺】 RAII实现智能指针

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 为什么需要智能指针&#xff1f; 内存泄漏 什么是内存泄漏&#xff0c;内存泄露的危害 内存泄漏的分类 堆内存泄漏&#xff08;Heap leak&#xff09; 系统资…

LIO-SAM 论文阅读

论文链接 LIO-SAM 0. Abstract 提出了一种通过平滑和映射进行紧耦合激光雷达惯性里程计的框架 LIO-SAM&#xff0c;它实现了高精度、实时的移动机器人轨迹估计和地图构建 LIO-SAM 在因子图上制定激光雷达惯性里程计&#xff0c;允许将多种相对和绝对测量&#xff08;包括闭环…

k8s-基础知识(Pod,Deployment,ReplicaSet)

k8s职责 自动化容器部署和复制随时扩展或收缩容器容器分组group&#xff0c;并且提供容器间的负载均衡实时监控&#xff0c;即时故障发现&#xff0c;自动替换 k8s概念及架构 pod pod是容器的容器&#xff0c;可以包含多个container pod是k8s最小可部署单元&#xff0c;容器…

理解分布式存储的真实成本 - 10PB的硬件和软件

我们最近与一家大型银行的首席信息官进行了一次对话。他们是全球系统性重要银行之一——规模极其庞大。这位CIO决定将MinIO引入为数据分析计划的对象存储。这个部署从抵押贷款、交易和新闻平台收集数据&#xff0c;以运行Spark和其他分析工具&#xff0c;为银行提供洞察力。Min…

【C语言】【插入排序】

void InsertSort(int* a, int n) {int end 0, tmp 0;for (int i 0;i < n - 1;i){end i;tmp a[end 1];while (end > 0){if (a[end] > tmp){a[end 1] a[end];--end;}elsebreak;}a[end 1] tmp;} }逻辑解释&#xff1a; 变量end代表某次循环&#xff0c;要比较…

学习笔记-李沐动手学深度学习(三)(10-11,隐藏层、多层感知机、激活函数、模型超参数选择、欠过拟合)

总结 多体会&#xff08;宏观、哲学&#xff09; 【深度学习的核心】首先是要模型足够大&#xff0c;在此基础上通过各种手段 来控制模型容量&#xff0c;使得最终得到较小的泛化误差 【一般深度学习特指神经网络 这一块】 【学习的核心是要学习 本质上不变的那些核心思想&a…