Flowable 工作流引擎

1、核心類

Flowable 引擎通過?ProcessEngine?作為總入口點,提供了多個核心服務接口,每個服務都負責特定的功能領域:

服務名稱 (Service Name)主要功能 (Main Functionality)關鍵操作 (Key Operations)
RepositoryService管理流程定義和部署(存儲和檢索流程定義資源)部署流程定義、查詢流程定義、暫停/激活流程定義
RuntimeService管理流程實例和執行(啟動流程實例、管理流程變量、觸發繼續操作)啟動流程實例、設置/獲取流程變量、查詢流程實例和執行
TaskService管理用戶任務(查詢、認領、完成、刪除任務)查詢任務、認領任務、完成任務、設置任務變量
HistoryService訪問歷史數據(查詢已完成的流程實例、任務、活動實例等)查詢歷史流程實例、歷史任務、歷史活動細節
IdentityService管理用戶和組(創建、查詢、刪除用戶和組信息)創建用戶/組、查詢用戶/組、建立用戶與組的關系
ManagementService提供引擎管理和維護功能(查詢數據庫表、管理作業)查詢數據庫表信息、管理作業(如定時器)
FormService管理表單數據(可選服務,處理開始表單和任務表單數據)獲取開始表單數據、提交任務表單數據
DynamicBpmnService動態修改流程定義(無需重新部署即可更新流程元素屬性)修改用戶任務辦理人、修改服務任務類名、更新順序流條件

2、常用Api

1、流程定義

ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").latestVersion().singleResult();

2、流程實例

ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());

3、部署單元

Deployment deployment = repositoryService.createDeployment().addClasspathResource("process/performance.bpmn20.xml").name("績效流程").category("HR").deploy();

4、啟動流程實例

Map<String, Object> variables = new HashMap<>();
variables.put("employee", "張三");
variables.put("nrOfHolidays", 5);
variables.put("description", "年假申請");ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);processInstance.getId();

5、查詢用戶任務

// 查詢任務
taskService.createTaskQuery().taskAssignee(assignee).orderByTaskCreateTime().desc().list();// 完成任務        
taskService.complete(taskId);

6、歷史數據查詢

List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery().finished().orderByProcessInstanceEndTime().desc().list();

7、JavaDelegate 實現服務任務

/*** 請假審批服務任務*/
public class LeaveApprovalServiceTask implements JavaDelegate {@Overridepublic void execute(DelegateExecution execution) {// 從流程變量中獲取數據String employee = (String) execution.getVariable("employee");Integer nrOfHolidays = (Integer) execution.getVariable("nrOfHolidays");String description = (String) execution.getVariable("description");// 執行業務邏輯,例如發送郵件、調用外部系統等boolean approved = approveLeaveRequest(employee, nrOfHolidays, description);// 設置審批結果流程變量execution.setVariable("approved", approved);System.out.println("請假申請審批完成: " + approved);}private boolean approveLeaveRequest(String employee, int nrOfHolidays, String reason) {// 這里實現具體的審批邏輯// 示例簡單規則:請假天數小于7天自動批準return nrOfHolidays <= 7;}
}

8、TaskListener

事件類型 (Event Type)觸發時機說明典型應用場景
create當任務已經創建,并且所有任務參數都已經設置完成后觸發。動態設置任務的辦理人、候選人或候選組。
assignment當任務已經指派給某個辦理人后觸發。注意:此事件在?create?事件之前被觸發。記錄任務分配信息,或向被指派者發送通知。
complete當任務已經完成(審批通過或拒絕),但尚未從運行時數據中刪除時觸發。根據任務結果更新業務狀態,執行后續業務操作。
delete在任務被刪除之前觸發。清理與任務相關的資源或狀態。

xml配置

<userTask id="user_approval_task" name="用戶審批任務" flowable:formKey="approval_form"><extensionElements><!-- 使用 delegateExpression 來引用Spring容器中的Bean --><flowable:taskListener event="create" delegateExpression="${dynamicAssigneeListener}"/></extensionElements>
</userTask

/*** 動態設置任務辦理人的監聽器示例* 使用 @Component 注解,并指定 Bean 名稱(與流程定義中的 delegateExpression 對應)*/
@Component("dynamicAssigneeListener") // 這個值需要與流程XML中的delegateExpression一致
public class DynamicAssigneeListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {// 1. 獲取當前任務的事件類型String eventName = delegateTask.getEventName();System.out.println("任務監聽器被觸發,事件類型: " + eventName);// 2. 通常我們只在 create 事件中設置辦理人if (TaskListener.EVENTNAME_CREATE.equals(eventName)) {// 3. 這里是你的業務邏輯:根據流程變量、組織架構等動態決定辦理人// 例如,從流程變量中獲取預先設置的辦理人String assignee = (String) delegateTask.getVariable("assignee"); // 來自流程變量的辦理人// 4. 如果變量中存在辦理人,則設置;否則可以設置一個默認值或根據其他邏輯獲取if (assignee != null && !assignee.isEmpty()) {delegateTask.setAssignee(assignee);} else {// 示例:默認指派給特定用戶(實際項目中請替換為你的邏輯)String defaultAssignee = "*****"; // 默認辦理人delegateTask.setAssignee(defaultAssignee);}}}
}

9、網關

  • 排他網關ExclusiveGateway

有多個條件入口,最終只能有一個條件出口,每個條件之間是競爭關系,只要有一個條件成立就會流轉到下一個節點。

  • 并行網關ParallelGateway

必須網關中的每個任務都完成,才會進入下一個節點。

  • 包容網關InclusiveGateway

排他網關和并行網關的結合體

  • 事件網關 EventGateway

根據事件(如消息事件、信號事件等)來決定流程的走向。它不會計算條件,而是等待事件的發生。每個出口都是中間捕獲事件

3、核心表

通用數據表(2個)
歷史表(8個,HistoryService接口操作的表)
用戶相關表(4個,IdentityService接口操作的表)
流程定義、流程模板相關表(3個,RepositoryService接口操作的表)
流程運行時表(6個,RuntimeService接口操作的表)

1、Flowable的所有數據庫表都以ACT_開頭
2、ACT_RE_: 'RE’代表repository。帶有這個前綴的表包含“靜態”信息,例如流程定義與流程資源(圖片、規則等)。
3、ACT_RU_: 'RU’代表runtime。這些表存儲運行時信息,例如流程實例(process instance)、用戶任務(user task)、變量(variable)、作業(job)等。Flowable只在流程實例運行中保存運行時數據,并在流程實例結束時刪除記錄。這樣保證運行時表小和快。
4、ACT_HI_: 'HI’代表history。這些表存儲歷史數據,例如已完成的流程實例、變量、任務等。
5、ACT_GE_: 通用數據。在多處使用。act_ge_bytearray:二進制數據表,如流程定義、流程模板、流程圖的字節流文件;
act_ge_property:屬性數據表# HistoryService
act_hi_actinst:歷史節點表,存放流程實例運轉的各個節點信息(包含開始、結束等非任務節點);
act_hi_attachment:歷史附件表,存放歷史節點上傳的附件信息(不常用);
act_hi_comment:歷史意見表;
act_hi_detail:歷史詳情表,存儲節點運轉的一些信息(不常用);
act_hi_identitylink:歷史流程人員表,存儲流程各節點候選、辦理人員信息,常用于查詢某人或部門的已辦任務;
act_hi_procinst:歷史流程實例表,存儲流程實例歷史數據(包含正在運行的流程實例);
act_hi_taskinst:歷史流程任務表,存儲歷史任務節點;
act_hi_varinst:流程歷史變量表,存儲流程歷史節點的變量信息;# IdentityService
act_id_group:用戶組信息表,對應節點選定候選組信息;
act_id_info:用戶擴展信息表,存儲用戶擴展信息;
act_id_membership:用戶與用戶組關系表;
act_id_user:用戶信息表,對應節點選定辦理人或候選人信息;# RepositoryService
act_re_deployment:部屬信息表,存儲流程定義、模板部署信息;
act_re_procdef:流程定義信息表,存儲流程定義相關描述信息,但其真正內容存儲在act_ge_bytearray表中,以字節形式存儲;
act_re_model:流程模板信息表,存儲流程模板相關描述信息,但其真正內容存儲在act_ge_bytearray表中,以字節形式存儲;# RuntimeService
act_ru_task:運行時流程任務節點表,存儲運行中流程的任務節點信息,重要,常用于查詢人員或部門的待辦任務時使用;
act_ru_event_subscr:監聽信息表,不常用;
act_ru_execution:運行時流程執行實例表,記錄運行中流程運行的各個分支信息(當沒有子流程時,其數據與act_ru_task表數據是一一對應的);
act_ru_identitylink:運行時流程人員表,重要,常用于查詢人員或部門的待辦任務時使用;
act_ru_job:運行時定時任務數據表,存儲流程的定時任務信息;
act_ru_variable:運行時流程變量數據表,存儲運行中的流程各節點的變量信息;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98315.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98315.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98315.shtml

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

相關文章

(RDFS)隨機深度特征選擇方法解釋:簡而言之,RDFS主要針對的是惡意的服務器,它建立在客戶端是誠實的前提下。

1. 隨機深度特征選擇是怎么實現的&#xff1f;隨機深度特征選擇 是一種在分布式機器學習&#xff08;特別是聯邦學習&#xff09;中用于保護客戶端數據隱私的技術。它的核心思想是&#xff1a;在每一輪訓練中&#xff0c;每個客戶端隨機選擇模型的一個子集&#xff08;即“深度…

C++20格式化字符串:std::format的使用與實踐

在C編程中&#xff0c;字符串格式化是一項常見的任務。在C20引入std::format之前&#xff0c;開發者通常依賴于一些傳統的解決方案&#xff0c;如printf系列函數、sstream&#xff0c;或者第三方庫如boost.format。然而&#xff0c;這些方法在代碼可讀性、類型安全性和靈活性方…

【漏洞復現】CVE-2025-8088|WinRAR 路徑穿越漏洞:從原理到藍屏攻擊全流程

【漏洞復現】CVE-2025-8088&#xff5c;WinRAR 路徑穿越漏洞&#xff1a;從原理到藍屏攻擊全流程 前言 WinRAR 作為 Windows 平臺最常用的壓縮管理工具之一&#xff0c;幾乎是每臺電腦的 “標配軟件”。但在 2025 年 8 月&#xff0c;一款影響范圍覆蓋 WinRAR 0 至 7.12 全版本…

uniapp中使用echarts并且支持pc端的拖動、拖拽和其他交互事件

npm install echarts -D ? // "echarts": "^5.3.2", [推薦版本] // "zrender": "^5.3.2" [如果報錯的話就安裝這個]<template><view class"container"><view id"myChart" class"chart"…

Qt中QProxyStyledrawControl函數4個參數的意義

Qt中QProxyStyle::drawControl函數4個參數的意義 我們來詳細解釋一下 Qt 中 QProxyStyle::drawControl 函數的四個參數。 這個函數是 Qt 樣式系統中的一個核心方法&#xff0c;用于繪制標準 UI 元素&#xff08;如按鈕、復選框、菜單欄等&#xff09;。當你繼承 QProxyStyle 并…

idf-esp32 PWM呼吸燈(LEDC頭文件)

相關宏和變量#define LED_PIN GPIO_NUM_3 #define LEDC_CHANNEL LEDC_CHANNEL_0 #define LEDC_TIMER LEDC_TIMER_0 #define LEDC_MODE LEDC_LOW_SPEED_MODE #define LEDC_DUTY_RES LEDC_TIMER_13_BIT // 2^13 8192級亮度 #define LEDC_FREQUENCY 50…

PLC_博圖系列?基本指令”S_ODTS:分配保持型接通延時定時器參數并啟動“

PLC_博圖系列?基本指令”S_ODTS&#xff1a;分配保持型接通延時定時器參數并啟動“ 文章目錄PLC_博圖系列?基本指令”S_ODTS&#xff1a;分配保持型接通延時定時器參數并啟動“背景介紹S_ODTS&#xff1a; 分配保持型接通延時定時器參數并啟動說明參數脈沖時序圖示例關鍵字&a…

OneCode 可視化揭秘系列(三):AI MCP驅動的智能工作流邏輯編排

OneCode 可視化揭秘系列&#xff08;三&#xff09;&#xff1a;AI MCP驅動的智能工作流邏輯編排 引言 在前兩篇系列博文中&#xff0c;我們詳細探討了OneCode可視化動作的基礎配置與界面設計&#xff0c;以及組件交互與數據流管理。在本篇文章中&#xff0c;我們將深入剖析邏輯…

TypeORM、Sequelize、Hibernate 的優缺點對比:新手常見 SQL 與 ORM 踩坑總結

1. ORM 與關系型數據庫&#xff08;MySQL、PostgreSQL&#xff09; 的使用 SQL 語句編寫&#xff08;JOIN、GROUP BY、索引使用、事務控制&#xff09;與 ORM 映射&#xff08;如 Sequelize、TypeORM、Hibernate&#xff09;之間的差異會讓新手非常糾結&#xff1b;尤其是理解…

JavaScript 創建型設計模式詳解

1. 單例模式1.1. 使用場景在前端開發中&#xff0c;全局狀態管理、配置信息、數據庫連接等往往需要在應用中只存在一個實例&#xff0c;避免多次實例化帶來的數據不一致性。例如&#xff0c;在一個前端應用中&#xff0c;全局的 loading 狀態通常需要一個單例模式來確保其唯一性…

k8s除了主server服務器可正常使用kubectl命令,其他節點不能使用原因,以及如何在其他k8s節點正常使用kubectl命令??

kubectl 并不是“只能”在主節點&#xff08;Control Plane Node&#xff09;使用&#xff0c;而是因為它需要訪問 Kubernetes 的 kube-apiserver&#xff0c;而 kube-apiserver 通常只在主節點上運行并監聽內部網絡。簡單來說kubectl 需要連接 kube-apiserver&#xff01;&…

Custom SRP - Complex Maps

https://catlikecoding.com/unity/tutorials/custom-srp/complex-maps/1 創建材質球我們的材質已經支持光照,并且支持 Albedo 和 Emission 貼圖.創建材質球,并應用下面的電路板的圖分別作為 albedo emission設置材質球的金屬度為 1 , 光滑度為 0.952 Mask Map在 albedo 圖上的不…

repo 學習教程

你現在會用 git 了&#xff0c;接下來學 repo&#xff08;Google 推出來的多倉庫管理工具&#xff09;&#xff0c;其實就是在 Git 的基礎上做了一層封裝&#xff0c;方便同時管理很多 Git 倉庫。像 Android 源碼、Rockchip 全套 SDK 都是靠 repo 來拉取和管理的。 我給你分幾個…

[SWERC 2020] Safe Distance題解

[SWERC 2020] Safe Distance 題意 給定 NNN 個點與一個坐標 (X,Y)(X,Y)(X,Y)&#xff0c;求從點 (0,0)(0,0)(0,0) 到點 (X,Y)(X,Y)(X,Y) 規劃一條路線&#xff0c;不能走出 (0,0)(0,0)(0,0) 與 (X,Y)(X,Y)(X,Y) 間形成的矩形&#xff0c;使得通過這條路線時距離最近的點的距離…

Rewind-你人生的搜索引擎

本文轉載自&#xff1a;Rewind-你人生的搜索引擎 - Hello123工具導航 ** 一、&#x1f50d; Rewind 是什么&#xff1f;你的數字記憶增強神器 Rewind 是一款人工智能驅動的個人記憶助手&#xff0c;就像為你配備了一個「數字第二大腦」。它能自動記錄、保存并索引你在電腦和手…

開發小點 - 存

開發小點 1.Req注解 EqualsAndHashCode(callSuper true) Data public class BillSituationReq extends BillQueryReq {/*** Whether to display the ring ratio, default is not displayed*/ApiModelProperty("Whether to Display YoY Comparison")private Boolean …

只會npm install?這5個隱藏技巧讓你效率翻倍!

原文鏈接&#xff1a;https://mp.weixin.qq.com/s/nijxVWj-E5U08DX2fl3vgg最近有個剛學前端的小伙伴問我&#xff1a;“為什么我的node_modules這么大&#xff1f;為什么別人裝依賴那么快&#xff1f;npx到底是啥玩意兒&#xff1f;” 相信不少人都跟他一樣&#xff0c;對npm的…

(二).net面試(static)

文章目錄項目地址一、基礎501.1 new keyword1.2 static class vs. static method1. static class2. static method3. static constructor 靜態構造函數4. 靜態成員的生命周期1.3 LinQ1.what is LinQ2. List<T>、IEnumerable<T>、IQueryable<T>3. 在數據庫里用…

docker,本地目錄掛載

理解Docker本地目錄掛載的基本概念Docker本地目錄掛載允許容器與宿主機共享文件或目錄&#xff0c;實現數據持久化和實時交互。掛載方式分為bind mount和volume兩種&#xff0c;前者直接映射宿主機路徑&#xff0c;后者由Docker管理存儲路徑。本地目錄掛載的核心方法bind mount…

IO多路復用相關知識

select、poll、epoll 在傳入的性能差異是不是體現在&#xff0c;當有新的連接過來&#xff0c;此時需要將新的fd傳入到內核中&#xff0c;但是poll/select需要出入整個數組&#xff0c;而epoll方式只需要出入單個fd&#xff1f; 1. select/poll 的情況它們沒有內核中“長期保存…