Flowable學習筆記(一)


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);
       return cfg;
 }

        --->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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM