工作流引擎Flowable介绍及SpringBoot整合使用实例

Flowable简介

Flowable 是一个轻量级的业务流程管理(BPM)工作流引擎,基于 Activiti 项目发展而来,专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。

Flowable 的核心特点

  1. 基于 BPMN 2.0 标准
    • 支持使用 BPMN(Business Process Model and Notation) 标准建模业务流程。
    • 提供图形化设计器(如 Flowable Modeler)来设计流程。
  2. 轻量级 & 可嵌入
    • 可以作为库集成到 Java 应用中,不依赖复杂的外部服务。
    • 支持 Spring Boot 快速集成。
  3. 多种流程管理能力
    • 支持 人工任务(User Task)自动服务任务(Service Task)定时器(Timer)子流程(Subprocess) 等。
    • 提供 流程实例管理任务分配历史数据查询 等功能。
  4. 支持多种数据库
    • 兼容 MySQL、PostgreSQL、Oracle、SQL Server 等关系型数据库。
  5. REST API 支持
    • 提供 Flowable REST API,方便与其他系统集成。
  6. 扩展性强
    • 支持自定义监听器(Listeners)、变量(Variables)和脚本(如 Groovy、JavaScript)。

Flowable UI

这里要体验一下Flowable的功能的话,最方便的是用docker跑一下官方的flowable ui,脚本如下:

docker run -d -p 8080:8080 flowable/flowable-ui

跑起来访问:http://localhost:8080/flowable-ui/ ,可以看到4个应用:

  1. 任务应用程序:可以发起流程,处理任务等操作
  2. 建模器应用程序:图形化流程设计工具、流程建模
  3. 管理员应用程式:流程监控和管理控制台
  4. 身份管理应用程序:用户管理

这个主要是体验一下Flowable的功能,一般我们可能不会在项目上直接用这些应用程序,但是其中一个比较重要的应用建模器应用程序肯定是会用到的,主要是使用它对我们的业务流程进行编排,它使用的是BPMN(Business Process Model and Notation) 标准建模业务流程,提供了图形化设计器(Flowable Modeler)来设计流程。
虽然idea有插件可以支持BPMN图形化编辑,但是我并不推荐,可以装一个查看流程图,但是编辑我没有找到多节点任务相关的配置,可能是支持并不完全,所以直接使用官方提供的工具肯定是最好的。
BPMN(Business Process Model and Notation) 是一个标准建模业务流程,不只是Flowable,还有其他的一些工作流引擎同样是用的这个标准,如:Activiti、Camunda、jBPM等,所以使用以上任意一个工作流引擎都需要了解BPMN建模方法。
https://chengpei.top/upload/flowable-modeler.jpg
以上是我创建的一个请假的审批流程:

  1. 发起人发起请假流程,填写姓名、请假天数、理由信息
  2. 请假天数大于3天则由部门经理审批,请假天数小于3天则由小组leader审批
  3. 初审通过后由HR审核,这里创建的是多实例用户节点,可以由多个HR同时审批,任意一个HR操作审核通过即可(或签)
  4. 两次的审核任意一次审核驳回了,就调用服务节点,执行我们的一段Java代码,这里就是自己去实现发邮件、发短信等等操作

这里就以这么一个流程为例,整合到SpringBoot中,通过提供接口的方式,实现流程的发起、待审核任务的查询、审核指定任务、回调服务代码等功能。

flowable-spring-boot-starter

这里用的是flowable-spring-boot-starter这个starter依赖,版本选用的是7.1.0,对应的JDK17,spring-boot版本3.3.8,数据库用的MySql 8,添加以下依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>7.1.0</version></dependency>
</dependencies>

配置添加数据库的连接配置即可,flowable配置基本都有默认值,如果需要修改可以看看flowable流程引擎的自动装配类ProcessEngineAutoConfiguration相关的一些配置类FlowableProperties
基本不需要做什么其他配置,引入依赖后启动项目,会自动创建流程引擎相关的表,一共有62张表。

主要的服务类

操作流程引擎最主要使用到的是以下几个核心的类,可以注入到我们的程序里:

@Resource
private ProcessEngine processEngine;@Resource
private RepositoryService repositoryService;@Resource
private RuntimeService runtimeService;@Resource
private TaskService taskService;

ProcessEngine

用途:Flowable 的核心引擎,是所有服务的入口,用于获取其他服务实例(如 RepositoryServiceRuntimeService 等)。

RepositoryService

用途:管理 流程定义(Process Definition)部署(Deployment),操作静态资源(如 BPMN 文件)。
核心功能

  • 部署流程定义(.bpmn.bpmn20.xml 文件)。
  • 查询、删除流程定义。
  • 挂起/激活流程定义。

RuntimeService

用途:管理 流程实例(Process Instance)执行流(Execution),负责流程的启动与运行时控制。
核心功能

  • 启动流程实例(基于流程定义)。
  • 触发流程继续执行(如通过信号事件)。
  • 查询或操作运行中的流程实例。

TaskService

用途:管理 用户任务(User Task),处理人工审批环节。
核心功能:

  • 查询任务(如待办任务、已完成任务)。
  • 完成任务(提交审批)。
  • 分配任务给用户/组。
  • 设置任务变量(如审批意见)。

使用以上的几个服务类即可完成流程审批的业务流程,具体代码我已经上传到github
https://github.com/chengpei/spring-ai-demo
其中flowable-demo模块就是Flowable流程相关的代码,其他模块是spring ai相关的代码可以忽略。

流程部署

在Flowable UI章节我使用建模器应用程序创建了一个请假的审批流程,在页面上找到导出到BPMN2按钮,会下载一个xml文件,里面就是我们定义的流程描述文件,将项目的resources目录下新建一个文件夹processes,将流程描述文件放入到该文件夹下,重启项目即可,程序会自动读取该文件夹内的流程自动部署。
如果需要更改文件夹位置,可以修改配置flowable.processDefinitionLocationPrefix,配置在FlowableProperties类里

演示代码

代码我已经上传到github
https://github.com/chengpei/spring-ai-demo
主要是FlowableDemoController里的几个接口,这里就不贴代码了,直接github中找到项目的flowable-demo模块,其他模块是spring ai相关的代码请忽略,以下是接口调用的示例:

### 发起流程
GET http://localhost:8080/flowable/start?name=zhangsan&days=5&reason=不想上班### 查询我的任务
GET http://localhost:8080/flowable/queryTask?name=manager&processId=09295702-0877-11f0-a7fe-bafcde6eec46### 任务审核 - 通过
GET http://localhost:8080/flowable/completeTask?taskId=7d7a3749-0876-11f0-a354-bafcde6eec46&outcome=通过
### 任务审核 - 驳回
GET http://localhost:8080/flowable/completeTask?taskId=094f55a1-0877-11f0-a7fe-bafcde6eec46&outcome=驳回### 查看任务流程图
GET http://localhost:8080/flowable/processDiagram?processId=09295702-0877-11f0-a7fe-bafcde6eec46

跑起来看看代码调用效果就可以了,也比较简单,每执行一步可以在游览器里调用查看任务流程图接口,看流程执行到哪一步了,其中唯一可能值得说一说的就是HR审核节点,是一个多实例用户节点

多实例任务节点

上述请假流程中的HR审核接口是一个多实例任务节点,所谓多实例就是该节点的处理人涉及到多人,配置如下:
https://www.chengpei.top/upload/flowable-duoshili.png
多实例类型:有并行和串行两种方式,并行可能用的比较多,一般到这个接口多实例的每个处理人是同时收到这个任务,可以同时处理,这就是并行。
集合(多实例):指向一个流程变量,这个变量可以是一个数组,每个元素就是处理人
元素变量(多实例):类似for循环集合中的每一项,for (var 元素变量 in 集合)
完成条件(多实例):指该多实例节点任务的完成条件,其中涉及以下几个变量:

  • nrOfInstances:实例总数。
  • nrOfActiveInstances:当前活动的(即未完成的),实例数量。对于顺序多实例,这个值总为1。
  • nrOfCompletedInstances:已完成的实例数量。
  • loopCounter:给定实例在_for-each循环中的index_。可以通过Flowable的elementIndexVariable属性为loopCounter变量重命名。

我这里配置的是${nrOfCompletedInstances==1},代表多实例节点已完成的实例数量为1就算节点完成,业务上我们称它为或签,多个并行的处理人只要有一个处理了就算完成。业务上对应的还有一种会签,代表多个并行的处理人全部处理了才算完成,可以配置为${nrOfCompletedInstances==nrOfInstances}
参考中文翻译文档这个章节:https://tkjohn.github.io/flowable-userguide/#bpmnMultiInstance

参考资料:
官网网站:https://www.flowable.com/open-source
官方文档:https://www.flowable.com/open-source/docs/oss-introduction
中文翻译文档:https://tkjohn.github.io/flowable-userguide/
虽然中文翻译文档版本不是最新的,不过基本功能都一样

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)

一、 高斯滤波 边缘检测本身属于锐化操作&#xff0c;对噪点比较敏感&#xff0c;所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。 二、计算图像的梯度和方向 三、非极大值抑制 在得到每个边缘的方向之后&#xff0c;其实把它们连起来边缘检测就算完了…

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏&#xff0c;承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏&#xff0c;包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者&#xff0c;都能从本文中获得启发。 …

JS数组方法

数组方法 一、数组 JavaScript 数组的大小是可调整的&#xff0c;并且可以包含不同 数据类型。&#xff08;当不需要这些特性时&#xff0c;请使用 类型数组。&#xff09; 注&#xff1a;JavaScript 类型数组是类似数组的对象&#xff0c;它提供了一种在内存缓冲区中读取和写…

string 的接口

我们继续来讲解一些常用的string接口。 一.at接口 我们来看一个越界的问题。 我们运行之后发现这是一个断言错误&#xff0c;直接就终止我们的程序了&#xff0c;不能作为异常被捕捉到&#xff0c;但是我们如果不想让程序直接崩溃该怎么办呢&#xff1f; 此时我们就要用到at关键…

2000-2019年各省地方财政行政事业性收费收入数据

2000-2019年各省地方财政行政事业性收费收入数据 1、时间&#xff1a;2000-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政行政事业性收费收入 4、范围&#xff1a;31省 5、指标说明&#xff1a;地方财政行政事业…

Pytorch学习笔记(九)Learning PyTorch - Deep Learning with PyTorch: A 60 Minute Blitz

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 Deep Learning with PyTorch: A 60 Minute Blitz 部分&#xff0c; 官网链接&#xff1a;https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 完整网盘链接: https://pan.baidu.com/s/1L9…

Elasticsearch 的搜索功能

Elasticsearch 的搜索功能 建议阅读顺序&#xff1a; Elasticsearch 入门Elasticsearch 搜索&#xff08;本文&#xff09; 1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能&#xff0c;现在先将文档添加到索引中&#xff0c;接下来完成搜索的方法。 查询的分类&…

比特币等虚拟货币实时价格使用说明,数字货币价格获取,k线获取,实时价格获取

数据截图 k线数据 websocket 实时价格数据 根据这些数据可以做出自己的产品 获取时间段内的k线数据 在开始之前&#xff0c;你需要知道的知识&#xff1a; 币种缩写英文名币种IDBTCBitcoinbitcoinETHEthereumethereumEOSEOSeosUSDTTethertetherLTCLitecoinlitecoinUSDDol…

初阶7 vector

本章重点 vector的介绍vector的使用vector的模拟实现 1.vector的介绍 vector就类似数据结构中的顺序表 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。 意味着可以采用下标对vector的元素 进行访问&#xff0c;和数…

解码未来:DeepSeek开源FlashMLA,推理加速核心技术,引领AI变革

前言&#xff1a; DeepSeek 兑现了自己的诺言&#xff0c;开源了一款用于 Hopper GPU 的高效型 MLA 解码核&#xff1a;FlashMLA。 项目地址&#xff1a;https://github.com/deepseek-ai/FlashMLA 1:FlashMLA 是什么呀&#xff1f; MLA是DeepSeek大模型的重要技术创新点&…

scss预处理器对比css的优点以及基本的使用

本文主要在vue中演示&#xff0c;scss的基本使用。安装命令 npm install sass sass-loader --save-dev 变量 SCSS 支持变量&#xff0c;可将常用的值&#xff08;如颜色、字体大小、间距等&#xff09;定义为变量&#xff0c;方便重复使用和统一修改。 <template><…

GPU架构与通信互联技术介绍

文章目录 GPU架构介绍SM 和 Warp Scheduler GPU通信互联技术介绍1、GPUDirectGPUDirect Shared AccessGPUDirect P2PGPUDirect for VideoGPUDirect for RDMARDMAGPUDirect RDMA GPUDirect Storage 2、NVLink & NVSwitchNVLinkNVSwitch 3、应用场景总结 GPU架构介绍 SM 和 …

强化学习与神经网络结合(以 DQN 展开)

目录 基于 PyTorch 实现简单 DQN double DQN dueling DQN Noisy DQN&#xff1a;通过噪声层实现探索&#xff0c;替代 ε- 贪心策略 Rainbow_DQN如何计算连续型的Actions 强化学习中&#xff0c;智能体&#xff08;Agent&#xff09;通过与环境交互学习最优策略。当状态空间或动…

day 16

创建链接文件 软链接&#xff1a;又叫符号链接&#xff0c;类似win的快捷方式&#xff0c;是一种用来建立文件的特殊文件&#xff0c;这个文件里的数据都是建立链接的文件&#xff0c;但是它和建立链接的文件不是一个东西&#xff0c;如果建立链接的文件移动或删除&#xff0c…

fork系统调用

基本概念&#xff1a; 在操作系统里&#xff0c;进程是正在运行的程序的实例。fork() 函数的作用是复制当前进程&#xff0c;生成一个新的进程&#xff0c;这个新进程被称作子进程&#xff0c;而原本的进程则是父进程。这两个进程&#xff08;父进程和子进程&#xff09;会从 …

【leetcode刷题记录】(java)数组 链表 哈希表

文章目录 四、题目之&#xff1a;代码随想录(1) 代码随想录&#xff1a;数组[704. 二分查找](https://leetcode.cn/problems/binary-search/)[27. 移除元素](https://leetcode.cn/problems/remove-element/)暴力解:双指针&#xff1a; [977. 有序数组的平方](https://leetcode.…

在线运行vscode

安装 https://github.com/coder/code-server?utm_sourcesyndication&pubDate20250317 运行前预览脚本 curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run运行脚本 curl -fsSL https://code-server.dev/install.sh | sh其他 可以通过后台服务运行&am…

【Tauri2】002——Cargo.toml和入口文件

目录 前言 正文 toml文件的基础 注释——# Comment 键值对——Key/Value 表——[table] 内联表——Inline Table 数组——Array package和crate Cargo.toml文件 Cargo.toml——dependencies Cargo.toml——lib crate-type main.rs 前言 【Tauri2】001——安装及…

Netty源码—7.ByteBuf原理三

大纲 9.Netty的内存规格 10.缓存数据结构 11.命中缓存的分配流程 12.Netty里有关内存分配的重要概念 13.Page级别的内存分配 14.SubPage级别的内存分配 15.ByteBuf的回收 9.Netty的内存规格 (1)4种内存规格 (2)内存申请单位 (1)4种内存规格 一.tiny&#xff1a;表示从…

W、M、C练题笔记(持续更新中)

web here are the flag 点击&#xff0c;页面跳转404.php&#xff0c;用bp抓包访问/flag.php页面&#xff0c;得到flag用base64解码 TryToFindFlag 打开后查看源代码 发现是robots协议&#xff0c;访问robots.txt 访问flllaaa......&#xff0c;得到空白页面&#xff0c;查看…