Flowable 中文文檔網址:http://www.shareniu.com/flowable6.5_zh_document/bpm/index.html
2.1 Flowable是什么?
Flowable--定義:使用Java編寫的輕量級業務流程引擎。
工作流引擎:指workflow作為應用系統的一部分,並為之提供對各應用系統有決定作用的根據角色、分工和條件的不同決定信息傳遞路由、內容等級等核心解決方案。
工作流引擎功能包括流程的節點管理、流向管理、流程樣例管理....重要功能
工作流簡介https://blog.csdn.net/shankaipingo/article/details/1387615
業務流程引擎:
流程定義主要包括兩個文件:bpmn文件和流程圖片
Flowable--功能:1.部署BPMN 2.0流程定義
2.創建流程定義的流程實例
3.查詢/訪問運行中(或歷史)的流程實例及相關數據
Flowable--優點:1.可以將JAR形式發布的Flowable庫加入應用或服務,來嵌入引擎。
2.可以使用Flowable REST API進行HTTP調用
3.提供了可使用簡單方便的UI的Flowable應用
2.2 Flowable 是activiti的fork
activiti是一個著名的工作流引擎(一個工作審批流)。Activiti項目是一項新的基於Apache許可的開源BPM平台,從基礎開始構建,旨在提供支持新的BPMN 2.0標准,包括支持對象管理組(OMG),可以定義流程、執行流程並以不同方式對其實現運行。
activiti運行后生成的一些表:
關於activiti提供的服務:
1:RepositoryService:Activiti倉庫服務類,管理流程定義。(倉庫中存儲流程定義的兩個文件:bpmn文件和流程圖片)
2:RuntimeService:Activiti流程執行服務類,執行(啟動/推進/刪除...流程實例)管理
3:TaskService:Activiti任務服務類,跟蹤UserTasks,可以使用此服務創建任務、聲明並完成任務,分配任務等。
4:HistoryService:Activiti查詢歷史信息類
5:IdentityService:組織機構,管理用戶和組
6:FormService:可選,用於定義中開始表單和任務表單
2.3 構建命令行程序
2.3.1 創建流程引擎
創建一個Flowable流程引擎,使用maven獲取Flowable依賴及管理構建。
maven基於項目對象模型(POM),通過對pom.xml文件配置,來管理項目構建,報告和文檔的軟件項目管理工具。
maven--合理敘述項目間依賴關系
maven的詳細介紹:https://blog.csdn.net/weixin_33853827/article/details/85910940?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
流程引擎創建:
1、添加flowable流程引擎和h2數據庫兩個依賴。pom文件中添加flowable流程引擎依賴時,需要將版本號修改為6.5.0
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-engine</artifactId>
<version>6.5.0</version>
</dependency>
2、在java的main方法中,創建一個流程引擎
初始化流程配置--創建流程引擎
main():ProcessEngine processEngine=creatProcessEngine(creatProcessEngineConfiguration());
(1)初始化流程配置:使用ProcessEngineConfiguration實例創建一個獨立(standlone)的processEngine,所需要的最小配置,是數據庫JDBC連接傳遞參數
* 初始化流程配置中心
* @return
*/
public static ProcessEngineConfiguration creatProcessEngineConfiguration () {
ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
.setJdbcUrl("jdbc:h2:mem:flowable;DB_CLOSE_DELAY=-1")
.setJdbcUsername("sa")
.setJdbcPassword("")
.setJdbcDriver("org.h2.Driver")
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
}
--->ProcessEngineConfiguration實例作用:配置與調整流程引擎的設置
--->獨立(standlone)配置對象,☞引擎完全獨立創建及使用【不是在Spring環境中使用,若在Spring環境中,需要使用SpringProcessEngineConfiguration類】
(2)這個配置創建ProcessEngine對象
/**
* 創建流程引擎實例
* @param cfg
* @return
*/
public static ProcessEngine creatProcessEngineConfiguration (ProcessEngineConfiguration cfg) {
return cfg.buildProcessEngine();
}
2.3.2 部署流程定義
步驟:流程定義建立(該節采用直接編寫BPMN2.0 的xml文件方式,其余方式見下)-部署(deploy)
1、流程定義的建立:在src/main/resources文件夾下寫一個holiday-request.bpmn20.xml文件【xml文件具體內容見官網http://www.shareniu.com/flowable6.5_zh_document/bpm/index.html#_deploying_a_process_definition】
一些概念:
*流程定義(process definition):重復執行流程的藍圖
*流程實例(process instance):某個角色提出的一個流程
*流程定義需要是BPMN2.0格式,一個流程定義可以啟動多個流程實例。例如:請假流程中:流程定義--請假的各個步驟;流程實例--某個雇員提出的一個請假申請
*BPMN格式存儲是一個XML,可以可視化;
*流程定義建立:使用可視化建模工具,eg:Flowable Designer(Eclipse)或Flowable Web Modeler(Web應用)
官網入門用戶手冊中流程定義的建立使用方式:直接撰寫XML--在src/main/resources文件夾下寫一個holiday-request.bpmn20.xml文件
所建立的流程定義---請假流程:(流程具體解釋見用戶手冊)
掌握幾個概念:start event--user task--exclusive gateway
圓圈:啟動事件
第一個矩形:用戶任務,人類用戶操作的步驟
帶叉菱形:排他網關
holiday-request.bpmn20.xml文件中需掌握的幾個概念:
活動(activity)--流程中的每一個步驟;每一個活動都有一個id屬性,也可設置一個名字,提高流程圖可讀性
順序流(sequence flow)--一個有向箭頭,用於連接活動
表達式條件(conditionExpression)--在排他網關中使用,當執行到排它網關時,計算表達式條件,使用第一個計算為true的順序流
流程變量(process variable)--條件表達式中的變量“approved”.流程變量是持久化數據。在特定步驟時設置這個變量,不是流程實例啟動時就可以得到的數值
執行(execution)
2、部署【將建立好的流程定義部署到Flowable引擎中】
掌握部署流程含義:部署一個流程定義
☞流程引擎會將XML文件存儲在數據庫中,在有需要的時候獲取它。
☞流程定義轉換為內部的、可執行的對象模型,使用它就可以啟動流程實例。
步驟:根據xml文件路徑的方式在倉庫中創建一個新的部署-->執行deploy()部署
從流程引擎對象processEngine對象得到一個倉庫服務類(RepositoryService)----使用creatDeployment()在倉庫中創建一個部署---使用deploy()方法部署該流程定義(
BPMN2.0.xml)
/**
* 將流程定義對象,部署到流程引擎的倉庫中。
* @param processEngine
* @param bpmnFiles
* @return
*/
public static Deployment deployFlowableXML(ProcessEngine processEngine,String bpmnFiles) {
return repositoryService(processEngine).createDeployment().addClasspathResource(bpmnFiles).deploy();
}
3、使用API查詢流程定義是否已經部署在flowable引擎中--通過RepositoryService創建的ProcessDefinitionQuery對象實現
2.3.3 啟動流程實例
根據在流程引擎中部署好的流程定義,啟動一個流程實例。
步驟:初始化流程變量--------RuntimeService啟動流程實例
啟動流程實例,需要提供一些初始化流程變量(process variable)【呈現給用戶的表單/其他系統自動觸發流程時通過REST API獲取】
REST:Representational State Transfer 資源表述性轉移。REST API介紹:https://blog.csdn.net/champaignwolf/article/details/84099258
(1)在這部分使用scanner類命令行輸入的數據作為初始化的流程變量。
(2)使用Map實例傳輸數據[Key--用於獲取變量的標識符--BPMN2.0 XML文件中id屬性]
(3)使用runtimeservice.startProcessInstanceByKey("holidayRequest", variables)啟動流程實例
2.3.4 事務
1、數據庫事務概念:一個數據庫事務通常包含了一個序列的對數據庫的讀/寫操作
2、數據庫事務存在目的:
(1)為數據庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即時在異常狀態仍能保持一致性的方法
(2)當多個應用程序在並發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。
在Flowable中,當一個流程實例運行時,總會有一個數據庫事務從前一個等待狀態持續到下一個等待狀態。引擎到達等待狀態的用戶任務后,狀態持久化到數據庫,提交事務,並返回API調用處
疑問???:每次用戶任務完成時都會啟動一個新的數據庫事務?還是一個流程實例只有一個數據庫事務??
2.3.5 查詢與完成任務
本小節功能:查詢有幾個任務並查看任務列表+任務的完成
實際應用中,會給角色(雇員/經理)提供登錄可查看的任務列表,並決定如何操作任務。本部分通過執行API調用--模擬任務列表
步驟:【查詢】:為用戶任務指派辦理人,獲得任務列表+【完成】
1、【查詢】:獲得任務列表-->使用TaskService創建的一個TaskQuery,查詢只返回的是‘managers’組的任務
Note:(1)List導入的包是:import java.util.List;(2)task 導入的包是:import org.flowable.task.api.Task;
結果:
2、【完成任務】:經理完成任務。--流程變量(process variable)的傳遞,實現:--帶有‘approved’變量的map模擬
//經理完成任務,使用帶有變量‘approved’的map模擬
boolean approved=scanner.nextLine().toLowerCase().equals("y");
variables = new HashMap<String,Object>();
variables.put("approved", approved);
taskService.complete(task.getId(), variables);
?輸入Yes/no后報錯;
原因:沒有實現申請通過后執行的自動邏輯---【解決方案】:第2.3.6節實現JavaDelegate
2.3.6 實現JavaDelegate
解釋:在之前的代碼中,沒有實現申請通過后執行的自動邏輯,即服務任務(service task)【圖形結構中帶‘設置’圖標的那些任務】。BPMN 20.xml文件下有引用類CallExternalSystemDelegate,而我們的項目中目前還沒有這個類
步驟:在org.flowable包下創建CallExternalSystemDelegate類,繼承JavaDelegate接口,實現execute()方法
公共接口JavaDelegate:
需要BPMN 2.0流程中的Java委派時應使用的便捷類(例如,調用自定義業務邏輯)。該類可用於服務任務和事件偵聽器。該類不允許影響控制流。它遵循默認的BPMN 2.0行為,即獲取每個輸出序列流(如果定義了條件,則條件為true)。如果您需要影響控制流,需使用類'org.flowable.engine .impl.pvm.delegate.ActivityBehavior'代替。
在該公共接口下,有一個execute()方法。
2.3.7 使用歷史數據--HistoryService
Flowable功能:自動存儲所有流程實例的審計數據或歷史數據
步驟:使用引擎獲取HistoryService--創建歷史活動實例查詢(添加過濾條件)
添加過濾條件:processInstanceId(processInstance.getId()).finished().orderByHistoricActivityInstanceEndTime().asc().list()
processInstanceId():僅選擇具有給定流程實例的歷史活動實例,ID與HistoricProcessInstanceID匹配
finished():僅選擇已經完成的歷史活動實例
orderByHistoricActivityInstanceEndTime():按照結束時間排序,需要后跟asc()或desc()
掌握HistoryService使用,getDurationInMillis()方法使用
運行結果:
2.3.8 小結
1、ProcessEngineConfiguration--可以從中構建流程引擎的配置信息;
創建processEngine配置對象cfg,使用buildProcessEngine()方法,創建processEngine對象。
2、ReposityService:提供對流程定義和部署倉庫的訪問的服務。提供一些靜態信息(不會改變,至少不會經常改變的信息)
(1)可用於將流程定義部署到流程引擎。使用creatDeployment()[創建一個新的部署]--deploy()方法
3、ProcessDefinition:一個對象結構,表示由活動和過渡組成的可執行流程。業務流程通常使用圖形編輯器創建,這些圖形編輯器以某種文件格式存儲流程定義。這些文件可以添加到Deployment控件,eg:Business Archive(.bar)文件。在部署時,引擎會將流程定義文件解析為此類的可執行實例。可用於啟動一個流程實例
(2)查詢流程定義是否在流程引擎。使用repositoryService(processEngine).createProcessDefinitionQuery()[查詢流程定義]
4、RuntimeService:
啟動流程實例。 使用runtimeService.
startProcessInstanceByKey()方法:Starts a new process instance in the latest version of the process definition with the given key
5、TaskService:提供訪問任務和表單相關的服務。
獲得任務列表:TaskService創建一個TaskQuery.
createTaskQuery()--返回一個新的TaskQuery,可用於動態查詢任務。
6、HistoryService:提供正在進行或過去的流程實例的信息的服務。這與運行時信息有所不同,因為該運行時信息在任何給定時刻僅包含實際運行時狀態,並且針對運行時過程執行性能進行了優化。歷史記錄信息經過優化,易於查詢,並在永久性存儲中永久保留。
creatHistoricActivityInstanceQuery():創建一個新的程序化查詢來搜索HistoricActivityInstances。