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:運行時流程變量數據表,存儲運行中的流程各節點的變量信息;