一文看懂開源工作流引擎 Flowable「轉」

原文鏈接:【https://xie.infoq.cn/article/ece75889c715e0bc87a73e44c】。

一、工作流引擎使用場景

工作流在企業管理系統中是高頻使用的功能,一個最常見的例子是請假加班申請與審批的過程。事實上,工作流引擎能支持的業務場景遠遠不止單據審批,幾乎所有涉及到業務流轉、多人按流程完成工作的場景背後都可以通過工作流引擎作為支撐。基於工作流引擎,可以搭建客戶關係管理系統(CRM)、運輸管理系統(TMS)、倉儲管理系統(WMS)、財務費用系統等多種複雜業務系統。對於達到一定規模的企業,良好的 BPM(業務流程管理,Business Process Management)體系可以支持創建公司內橫跨不同部門的複雜業務流程,既提高工作效率、又可推動企業規範化發展。



一文看懂開源工作流引擎 Flowable「轉」

圖1 業務流轉示意圖(圖片來源:www.flowable.com)



二、Flowable 是什麼

Flowable 是一個使用 Java 編寫的輕量級業務流程引擎,使用 Apache V2 license 協議開源。2016 年 10 月,Activiti 工作流引擎的主要開發者離開 Alfresco 公司並在 Activiti 分支基礎上開啟了 Flowable 開源項目。基於 Activiti v6 beta4 發佈的第一個 Flowable release 版本為 6.0。以 JAR 形式發佈使得 Flowable 可以輕易加入任何Java環境:Java SE、Tomcat、Jetty 或 Spring 之類的 servlet 容器;JBoss 或 WebSphere 之類的 Java EE 服務器等等。 另外,也可以使用 Flowable REST API 進行 HTTP 調用。

Flowable 項目中包括 BPMN(Business Process Model and Notation)引擎、CMMN(Case Management Model and Notation)引擎、DMN(Decision Model and Notation)引擎、表單引擎(Form Engine)等模塊。也有許多Flowable 應用(Flowable Modeler、Flowable Admin、Flowable IDM 與 Flowable Task),並提供了直接可用的 UI 示例。模塊之間協作關係可以參考下圖:



一文看懂開源工作流引擎 Flowable「轉」

圖2 Flowable 架構示意圖(圖片來源:www.shareniu.com)



構建 OA、CRM、TMS、財務管理等系統時,若基於 Flowable 生態做定製化開發可以大大減少開發成本,避免寫複雜而難以維護的條件代碼。Flowable 的關鍵為其核心引擎,核心引擎是一組服務的集合,並提供管理與執行業務流程的API。Flowable 生態系統中的業務流程引擎(BPMN)可以與決策引擎(DMN)、案例模型引擎(CMMN)、表單引擎聯動,開發者可以根據業務需求選用其中一個或多個模塊,通過模塊之間相互協作構建業務系統、以實現強大的功能。Flowable 團隊在開源項目之外也承接商業項目,提供 Flowable Work、Flowable Engage 等商業產品與服務,www.flowable.com 網站上提供了該團隊為銀行和保險業實施過的成功案例,展示了 Flowable 對複雜場景的業務支撐能力。下文簡要介紹 Flowable 中的幾個主要引擎模塊。



三、Flowable BPMN 業務流程引擎

流程引擎是支持配置業務流轉過程的關鍵模塊。Flowable 支持 BPMN 2.0 行業標準,同時提供了一些 Flowable 自定義的 BPMN 擴展(extensions)可選用,允許通過導入 XML 文件或通過前端可視化界面建立流程。Flowable 本身提供了一個流程繪製的 UI 界面(Flowable Modeler 應用),如下圖所示:

一文看懂開源工作流引擎 Flowable「轉」

圖3 Flowable Modeler 應用中的流程繪製界面



Flowable 業務流程引擎支持如下類型的流程元素:

1. 事件:事件(event)通常用於為流程生命週期中發生的事情建模。在 BPMN 2.0中,有兩種主要的事件分類:捕獲(catching)與拋出(throwing)事件。捕獲事件為當流程執行到達這個事件時,會等待直到觸發器動作。拋出事件當流程執行到達這個事件時,會觸發一個觸發器。具體事件包括定時器事件、啟動事件、結束事件、消息事件、信號事件、邊界事件等豐富類型。

2. 順序流:順序流(sequence flow)是流程中兩個元素間的連接器。在流程執行過程中,一個元素被訪問後,會沿著其所有出口順序流繼續執行。這意味著BPMN 2.0的默認是並行執行的:兩個出口順序流就會創建兩個獨立的、並行的執行路徑。

順序流上定義條件(conditional sequence flow)時為條件順序流。當離開 BPMN 2.0活動時,默認行為是計算其每個出口順序流上的條件。當條件計算為true時,選擇該出口順序流。如果該方法選擇了多條順序流,則會生成多個執行,流程會以並行方式繼續。但這種情況並不適用於網關(gateway),不同類型的網關,會用不同的方式處理帶有條件的順序流。所有的BPMN 2.0任務與網關都可以使用默認順序流(default sequence flow)。只有當沒有其他順序流可以選擇時,才會選擇默認順序流作為活動的出口順序流。流程會忽略默認順序流上的條件。

3. 網關:網關(gateway)用於控制執行的流向,可類比路口的分叉來理解。如按BPMN 2.0 的用詞也即是執行的「標誌(token)」。網關可以消費(consuming)與生成(generating)標誌。網關可細分為下列類型:

  • 排他網關(exclusive gateway):也叫異或網關 (XOR gateway),或者基於數據的排他網關 (exclusive data-based gateway),用於對流程中的決策建模。當執行到達這個網關時,會按照所有出口順序流定義的順序對它們進行計算。選擇第一個條件計算為 true 的順序流(當沒有設置條件時,認為順序流為true)繼續流程。使用排他網關時,只會選擇一條順序流。當多條順序流的條件都計算為true時,會且僅會選擇在XML中最先定義的順序流繼續流程。
  • 並行網關:並行網關不計算條件,如果連接到並行網關的順序流上定義了條件,會直接忽略該條件。並行網關(parallel gateway)可以將執行分支(fork)為多條路徑,也可以合併(join)多條入口路徑的執行,並行網關的功能取決於其入口與出口順序流。如果並行網關同時具有多條入口與出口順序流,可以同時具有分支與合併的行為。在這種情況下,網關首先合併所有入口順序流,然後分裂為多條並行執行路徑。
  • 包容網關:可看做排他網關與並行網關的組合。與排他網關一樣,可以在包容網關的出口順序流上定義條件,包容網關會計算條件。然而主要的區別是,包容網關與並行網關一樣,可以同時選擇多於一條出口順序流。包容網關的匯聚行為比並行網關更復雜。
  • 基於事件的網關:基於事件的網關(event-based gateway)提供了根據事件做選擇的方式。網關的每一條出口順序流都需要連接至一個捕獲中間事件。一個基於事件的網關,必須有兩條或更多的出口順序流。



4. 任務:Flowable 支持的任務類型超過十五種。

  • 用戶任務:用於對需要人工執行的任務進行建模。當流程執行到達用戶任務時,會為指派至該任務的用戶或組的任務列表創建一個新任務。用戶任務允許標識到期日期以及直接指派給用戶。
  • 郵件任務:Flowable 引擎可以向一個或多個收信人發送郵件,支持 cc、bcc、HTML 文本等等,使用支持 SMTP 的外部郵件服務器發送郵件。
  • 業務規則任務:業務規則任務(business rule task)用於同步地執行一條或多條規則。在 V6.3.0 到 V6.4.1 版本中,Flowable 使用名為 Drools Expert 的 Drools 規則引擎執行業務規則。截至 V6.4.1 版本,業務規則中包含的 .drl 文件,必須與定義了業務規則服務並執行規則的流程定義一起部署。這意味著流程中使用的所有 .drl 文件都需要打包在流程 BAR 文件中,與任務表單等類似。由於 Flowable 自己的規則引擎 DMN 功能逐漸完善,對業務規則任務的支持可能會在後續版本中變動,具體要看 Flowable 官方更新文檔。
  • 其他的任務類型還有腳本任務、Web 服務任務、Shell 任務、Java 服務任務、執行監聽器、任務監聽器等。



5. 子流程與調用活動:子流程(sub-process)是包含其他的活動、網關、事件等的活動。其本身構成一個流程,並作為更大流程的一部分。子流程完全在父流程中定義(所以也稱作嵌入式子流程)。在複雜流程流轉的場景下中子流程較為多見,使用這一特性可以比較靈活地維護包含子流程的審批路徑。

調用活動(call activity)有別於一般的子流程,調用活動引用一個流程定義外部的流程,而子流程嵌入在原有流程定義內。調用活動的主要使用場景是,在多個不同流程定義中調用一個可複用的流程定義。

一文看懂開源工作流引擎 Flowable「轉」

圖4 子流程示意圖 (圖片來源:https://www.flowable.org)



Flowable支持兩種方式使用表單:使用(由Flowable提供的表單設計器創建的)表單定義的內置表單渲染,以及外部表單渲染。內置表單設計器的詳細內容可以查看相應的表單引擎(Form Engine)用戶手冊。

Flowable 以事務的方式執行流程,可按照需求進行配置。如果 Flowable 被觸發(啟動流程,完成任務,為執行發送信號),Flowable 將沿流程執行,直到到達每個執行路徑的等待狀態。更具體地說,它以深度優先方式搜索流程圖,並在每個執行分支都到達等待狀態時返回。等待狀態是「之後」再執行的任務,也就是說著 Flowable 將當前執行持久化,並等待再次觸發。觸發可以來自外部來源如用戶任務或消息接受任務,也可以來自 Flowable 自身如定時器事件。

Flowable自帶身份管理模塊,但是從 Flowable V6 起身份管理(IDM IDentity Management)組件從 Flowable 引擎模塊中抽出,並將其邏輯移至幾個不同的模塊。默認情況下,IDM引擎在Flowable引擎啟動時初始化並啟動。Flowable 提供的幾個 web 應用中就包括 Flowable IDM(身份管理應用),為所有Flowable UI應用提供單點登錄認證功能,並且為擁有 IDM 管理員權限的用戶提供了管理用戶、組與權限的功能。其他 Web 應用還有:

  • Flowable Modeler: 讓具有建模權限的用戶可以創建流程模型、表單、選擇表與應用定義。
  • Flowable Task: 運行時任務應用。提供了啟動流程實例、編輯任務表單、完成任務,以及查詢流程實例與任務的功能。
  • Flowable Admin: 管理應用。讓具有管理員權限的用戶可以查詢BPMN、DMN、Form及Content引擎,並提供了許多選項用於修改流程實例、任務、作業等。管理應用通過REST API連接至引擎,並與Flowable Task應用及Flowable REST應用一同部署。

所有其他的應用都需要 Flowable IDM 提供認證。每個應用的WAR文件可以部署在相同的servlet容器(如Apache Tomcat)中,也可以部署在不同的容器中。由於每個應用使用相同的cookie進行認證,因此應用需要運行在相同的域名下。



四、Flowable DMN 決策引擎

作為以 BPMN 為核心的工作流引擎,Flowable 原本與規則引擎的關聯並不強,但實際業務流程中,有時需要由多個決策來決定流程走向,而每個決策都要根據自身的規則來決定,每個決策之間也可能存在關聯。此時就需要規則引擎來提供決策支撐。在規則引擎開源產品中,Drools 是最知名的一款,它實現了PMML(Predictive Model Markup Language)規範,同時支持 DMN (Decision Model and Notation)標準。Flowable 目前實現了 DMN V1.1 規範的框架,由於 DMN 規範中要求對 PMML 提供兼容性,這意味著 Flowable 具有相對強大的業務規則的處理能力。

在 Flowable Modeler 應用中 DMN 引擎體現為「決策表」菜單,可以通過界面進行 Input 與 Output 的配置,可導入 .dmn 擴展名格式的 DMN 定義。在 OMG (Object Management Group)制定的 DMN 規範中也有相應的XML格式約束。如果 DMN 引擎已經插入流程引擎,就可以與其他流程相關資源一起,將 DMN 定義打包進業務存檔(BAR)文件中。流程引擎部署服務會將 DMN 資源部署至 DMN 引擎。

一文看懂開源工作流引擎 Flowable「轉」

圖5 決策表配置界面 (圖片來源:https://www.flowable.org)



DMN 定義由決策(decision)和其他東西組成,決策由表達式描述。DMN 標準描述了幾種表達式的類型,目前在 Flowable DMN 中僅支持決策表(decision table)類型的表達式。決策表分為輸入表達式與輸出表達式兩個主要區域。在輸入表達式中,可以定義變量,用於規則輸入項(input entries)的表達式。可以通過選擇Add Input(添加輸入),定義多個輸入表達式。在輸出表達式中,可以定義選擇表執行結果要創建的變量(變量的值將用於輸出項表達式,在下面解釋)。可以通過選擇Add Output(添加輸出),定義多個輸出表達式。

在決策表編輯界面,可以選擇命中策略,共有兩大類(單命中、多命中)七種命中策略可選:

(1)單命中、第一命中(single hit & FIRST):多個規則允許交叉,執行從上到下的第一條命中項。

(2)單命中、唯一命中(single hit & UNIQUE):多個規則不允許交叉,執行從上到下的第一條唯一命中項。

(3)單命中、任一命中(single hit & ANY):規則允許交叉,但是所有輸出的優先級相同,隨機執行一條命中項。

(4)單命中、優先級(single hit & PRIORITY):多個命中規則的優先級不同,執行優先級最高的那條。

(5)多命中、輸出優先級排序(multiple hit & OUTPUT ORDER):按照輸出優先級遞減的順序返回所有命中。

(6)多命中、規則順序排序(multiple hit & RULE ORDER):按照規則順序返回所有命中。

(7)多命中、聚合(multiple hit & COLLECT):按照隨機順序返回所有命中。

DMN 可以被 BPMN 定義的流程調用:在流程中引入一個決策任務(Decision task),並選中引用決策表(Decision table reference),來使用新創建的選擇表。想深入瞭解DMN特性可參考這篇案例說明:https://flowable.com/blog/2016/09/decision-model-and-notation-dmn-how-to-start-a-project-2/ 。

一文看懂開源工作流引擎 Flowable「轉」

圖6 BPMN 中調用 DMN 示例(圖片來源:https://www.flowable.com)



五、Flowable CMMN 案例模型引擎

CMMN 是 Case Management Model 的縮寫,在 Flowable Modeler 應用中體現為「案例模型」菜單,使用時可以類似於流程引擎可視化配置流程,也可通過XML格式文件。CMMN(Case Management Model and Notation)行業標準 V1.1 版本於2016年發佈,目前 Flowable 的 V6.4.1 已支持此標準。

與 BPMN 引擎相比,CMMN 引擎適用於如下幾種場景:

(1)重複與並行的工作分發。BPMN 引擎在處理順序執行、職責分工明確的工作流程時有優勢,但面對動態、自由、並行的情況時,BPMN 顯得靈活性不足,此時CMMN 則更適合應對。

(2)處理帶有生命週期特徵的場景,如客戶、產品、項目、僱員。以項目為例,項目的立項、中止、收尾、交付等階段(phases),可以在 CMMN 中通過階段(Stages)概念在更高層次進行描述。

一文看懂開源工作流引擎 Flowable「轉」

圖7 CMMN 引擎使用場景示例



CMMN 中一個案例模型呈現為一個公文夾的樣式。每個案例模型都包含一個用於安置計劃元素的「計劃模型」,每個計劃元素包含一個明確其類型和可能配置選項的計劃元素定義,常見計劃元素如用戶任務(human task)、里程碑(milestone)、流程任務(process task)、案例任務(case task)和階段(stage)。例如下圖中的計劃模型包含三個用戶任務計劃項和一個里程碑。



一文看懂開源工作流引擎 Flowable「轉」

圖8 CMMN 計劃模型示意圖



Flowable CMMN 引擎支持如下類型的案例元素:

1. 階段(Stage):階段用於把一組元素聚合在一起,可以有進入和退出的條件。階段可以嵌套,一個階段中的計劃元素只有其父階段激活時才生效。

2. 任務(Task):任務是發生於引擎外部的事件,包含名稱、阻塞(決定任務是否阻塞的布爾值)、阻塞表達式(表達式的布爾值決定任務是否阻塞)等屬性。

3. 用戶任務(Human task):通常指需要用戶通過表單執行的手動任務,包含一系列屬性。

4. 里程碑(Milestone):里程碑標識某一具體案例到達特定點。

5. 案例任務(Case task):案例可以嵌套,案例中的子案例就是案例任務。

6. 流程任務(Process task):當流程任務阻塞時,實例化的計劃要素會處於激活狀態,直至流程任務完成。

7. 條件(Criteria):分為進入條件和退出條件。

8. 決策任務(Decision task):調用 DMN 引擎中的決策表。

9. HTTP任務、腳本任務、Java 服務任務、時間監聽器等:與 BPMN 中的相應元素含義相近,不再贅述。



六、Flowable Form 表單引擎

一文看懂開源工作流引擎 Flowable「轉」

圖9 Flowable Form引擎服務示意圖(圖片來源:www.flowable.org)



Flowable 框架中將表單作為一個獨立的子模塊,可以將表單作為一個服務在其他模塊中進行調用,表單服務就可以控制所有流程所使用的表單以及表單字段的可讀、可寫等操作。表單相關的使用可分為表單的定義以及表單的運行實例兩個階段。表單定義支持導入以 .form 為後綴的表單定義文件(JSON 語言編寫) 。在 Flowable Modeler 應用中,「表單」菜單下可以進行簡單的表單拖拽拼接可視化配置定義。flowable.com網站上也提供了一個可視化構建表單案例可以參考https://flowable.com/flowable-forms/。餘不贅述。



七、參考資料

1. Flowable 6.4.1 官方文檔 https://www.flowable.org/documentation.html

2. Flowable 商業案例介紹 https://flowable.com/casestudies/

3. TKJohn 博客 https://tkjohn.github.io

4. 分享牛博客 http://www.shareniu.com

5. IBM BPM解決方案https://www.ibm.com/cloud-computing/cn-zh/products/business-process-management/


分享到:


相關文章: