工作流引擎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.pswp.cn/diannao/75758.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75758.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75758.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【uni-app】引用公共組件

目錄 一、建立公共組件 1.1新建vue文件 1.2編寫公共文件代碼 1.3使用 注意事項 一、建立公共組件 1.1新建vue文件 在公共組件文件目錄下新建所需要的功能文件 1.2編寫公共文件代碼 按需求寫對應功能的代碼 1.3使用 在需要使用的文件下引用公共組件 注意事項 想要使用s…

STL中vector模擬實現

vector各個接口函數 //構造函數 vector() vector(size_t n,const T& valT()) vector(int n,const T& val T()) //拷貝構造函數 vector(const vector<T>& v) //迭代器版本的 vector(inputiterator first, inputiterator end) //賦值運算符重載 vector<T&…

DML 數據操縱語言學習筆記

一、DML 核心概念體系 1.1 語言定位與邊界 DML&#xff08;Data Manipulation Language&#xff09;作為 SQL 三大核心語言之一&#xff0c;專注于數據行級操作&#xff0c;區別于 DDL&#xff08;結構定義&#xff09;和 DCL&#xff08;權限控制&#xff09;。其核心指令包…

springboot的跨域是什么?遇到跨域問題如何解決?

在Spring Boot中&#xff0c;跨域是指當瀏覽器中的前端應用&#xff08;如運行在某個域名和端口下的前端頁面&#xff09;請求后端接口時&#xff0c;如果后端接口所在的域名、端口或協議與前端應用不一致&#xff0c;瀏覽器會阻止這種跨域請求。這是由于瀏覽器的同源策略&…

嘯叫抑制(AFS)從算法仿真到工程源碼實現-第八節-系統搭建

一、概述 系統分為錄音模塊、數據處理模塊、播音模塊。錄音模塊和播音模塊使用alsa庫進行讀寫數據。各模塊為獨立進程處理&#xff0c;模塊之間使用命名管道進行數據的傳輸。數據處理模塊我們使用基于頻域的自適應濾波去嘯叫算法。 二、工程實現 2.1 系統流程圖 2.2 錄音模塊…

HTML——什么是塊級元素,什么是內聯元素,有何區別

在 HTML 中&#xff0c;塊級元素&#xff08;Block-level element&#xff09;和內聯元素&#xff08;Inline element&#xff09;是兩種不同類型元素&#xff0c;它們在頁面布局和樣式應用方面有不同的行為和特性。 塊級元素&#xff08;Block-level element&#xff09; 塊級…

01 設計模式和設計原則

類設計原則&#xff1a; 單一職責原則&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;&#xff1a;實現類要職責單一開閉原則&#xff08;Open Close Principle&#xff0c;OCP&#xff09;&#xff1a;對擴展開放&#xff0c;對修改關閉里氏替換原則…

【踩坑日記】springboot 打包后實現類無法找到

試過了所有改什么目錄 依賴 clean都以失敗告終 最后將實現類的文件名從Impl改成impl宣布成功 記得使用idea自帶的重構

項目-蒼穹外賣(十五) WebSocket+語音播報功能實現(來訂單+催單)

一、介紹 二、入門案例 配置類&#xff1a; package com.sky.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter;/…

【Spring篇】Spring的生命周期

一、Bean 生命周期的核心階段 1. 實例化&#xff08;Instantiation&#xff09; ? 觸發時機&#xff1a;容器啟動時&#xff08;單例 Bean&#xff09;或請求時&#xff08;原型 Bean&#xff09;。 ? 實現方式&#xff1a; 通過反射&#xff08;Class.newInstance() 或構造…

Redis、Memcached應用場景對比

環境 Redis官方網站&#xff1a; Redis - The Real-time Data Platform Redis社區版本下載地址&#xff1a;Install Redis | Docs Memcached官方網站&#xff1a;memcached - a distributed memory object caching system Memcached下載地址&#xff1a;memcached - a dis…

kettle插件-mysql8數據庫插件

場景&#xff1a;群里有小伙伴反饋kettle 7.x版本不能自動連接mysql8&#xff0c;安排&#xff01;&#xff01;&#xff01; 1、將mysql8的驅動包mysql-connector-java-8.0.20.jar丟到kettle的lib目錄下&#xff0c;重啟spoon。 2、配置數據庫連接&#xff0c;提示驅動類不對…

【軟件測試】:軟件測試實戰

1. ?動化實施步驟 1.1 編寫web測試?例 1.2 ?動化測試腳本開發 common public class AutotestUtils {public static EdgeDriver driver;// 創建驅動對象public static EdgeDriver createDriver(){// 驅動對象已經創建好了 / 沒有創建if( driver null){driver new EdgeDr…

深度學習入門1 基于Python的理論與實現

torch.unsqueeze()將一維數據變為二維數據&#xff0c;torch只能處理二維數據 tensor不能反向&#xff0c;variable可以反向。variable.data.numpy()轉換為numpy 第3章 神經網絡 實現softmax函數時的注意事項&#xff1a;為防止e的指數運算造成溢出 矩陣的第 0 維是列方向,第…

解決 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 錯誤

解決 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 錯誤 在使用 Pentaho Data Integration&#xff08;也稱為 Kettle&#xff09;進行數據集成和ETL開發時&#xff0c;開發者可能會遇到各種依賴沖突和技術挑戰。本文將詳細介紹一個常見的錯…

第 五 章:優化算法_《C++性能優化指南》_notes

優化算法 第五章重難點詳解與代碼實戰編譯與測試說明第五章核心知識點整理重難點梳理 第一部分&#xff1a;多選題&#xff08;10道&#xff09;第二部分&#xff1a;設計題&#xff08;5道&#xff09;答案與詳解多選題答案&#xff1a; 設計題參考實現&#xff08;以題目2為例…

多版本PHP開發環境配置教程:WAMPServer下MySQL/Apache/MariaDB版本安裝與切換

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、版本切換指南總結 前言 由于有幾個項目分別使用到PHP7.0 和7.4以及8.0版本&#xff0c;設置mysql也會根據PHP版本使用不同的版本&#xff0c;于是開始研究…

2024年數維杯數學建模C題天然氣水合物資源量評價解題全過程論文及程序

2024年數維杯數學建模 C題 天然氣水合物資源量評價 原題再現&#xff1a; 天然氣水合物&#xff08;Natural Gas Hydrate/Gas Hydrate&#xff09;即可燃冰&#xff0c;是天然氣與水在高壓低溫條件下形成的類冰狀結晶物質&#xff0c;因其外觀像冰&#xff0c;遇火即燃&#…

階段一:Java基礎語法

目標&#xff1a;掌握Java的基本語法&#xff0c;理解變量、數據類型、運算符、控制結構等。 1. Java開發環境搭建 安裝JDK配置環境變量編寫第一個Java程序 代碼示例&#xff1a; // HelloWorld.java public class HelloWorld { // 定義類名為 HelloWorldpublic static vo…

從0到1,解鎖Ant Design X的無限可能

Ant Design X 是什么&#xff1f; 在人工智能飛速發展的當下&#xff0c;AI 驅動的界面已成為軟件開發的重要趨勢。而 Ant Design X 正是順應這一趨勢&#xff0c;于 2024 年應運而生的一款遵循 Ant Design 設計體系的 React UI 庫&#xff0c;它旨在幫助開發者輕松打造 AI 驅…