Slickflow.NET 開源工作流引擎高級開發(一) -- 流程外部事件的調用和變數存儲實現

来源:https://www.cnblogs.com/slickflow/archive/2019/01/29/10332493.html
-Advertisement-
Play Games

前言:流程實現基本流轉功能外,通常也需要調用外部事件,用於和業務系統的交互,同時存儲一些流程變數,用於追蹤和記錄業務數據變化對流程流轉的影響。 1. 流程事件 流程執行過程中,伴隨各種事件的發生,而且是存在於整個流程的生命周期,即從流程啟動一直到流程結束的整個過程都有事件發生。這些事件的發生,業務系 ...


前言:流程實現基本流轉功能外,通常也需要調用外部事件,用於和業務系統的交互,同時存儲一些流程變數,用於追蹤和記錄業務數據變化對流程流轉的影響。

1. 流程事件

        流程執行過程中,伴隨各種事件的發生,而且是存在於整個流程的生命周期,即從流程啟動一直到流程結束的整個過程都有事件發生。這些事件的發生,業務系統通常也需要知道一些流程過程的關鍵節點,或里程碑狀態。我們統稱為流程事件。

1.1  流程事件觸發類型

        流程事件類型的定義是按照事件發生的位置來確定劃分,跟流程直接有關的比如有:啟動、運行、撤銷、退回、返送、跳轉、返簽和結束等。而跟活動有關的事件類型有:創建、執行和結束等。我們可以用下圖來描述常見的事件觸發:

 

1.2  流程事件觸發實現

        流程事件的觸發,是按照先訂閱,後觸發的機制來實現。訂閱(Subscribe)是流程服務介面開放出來的方法,可以直接在這個方法裡面註冊匿名函數來綁定事件。程式代碼如下:

IWorkflowService wfService = new WorkflowService();
var wfResult = wfService.CreateRunner(runner.UserID, runner.UserName)
         .UseApp(runner.AppInstanceID, runner.AppName, runner.AppInstanceCode)
         .UseProcess(runner.ProcessGUID, runner.Version)
         .NextStep(runner.NextActivityPerformers)
         .IfCondition(runner.Conditions)	//condition on the transiton
         .Subscribe(EventFireTypeEnum.OnActivityExecuting, (activityInstanceID, activityCode, delegateService) => {
             if (activityCode == "Task1")
             {
                 delegateService.SetVariable("name", "book-task1");
                 delegateService.SetVariable("amount", "50");
             }
             return true;
         })
         .Run();

  

2. 事件類型節點

        BPMN規範裡面,涉及到事件類型的節點,雖然不同於任務類型的節點,但是事件類型的節點通常都是表示一種流程的狀態,比如流程的開始和結束是最基本的兩個狀態。中間事件(Intermediate Event)是本次我們主要涉及到的事件類型的節點,其它事件類型的節點將在後期的文章中描述到。

2.1 中間事件(Intermediate Event)

        中間事件(Intermediate Event)類型的節點一般用於流程中間狀態的變換,而且可以作為流程里程碑的事件或狀態觸發,用於通知業務系統流程的里程碑狀態已經發生,或者也可以收到業務系統的反饋的信息,用於一些流程下一步路徑的解析。

        比如在中間事件觸發時,只有從業務系統中讀取到業務變數,然後傳入流程的下一步分支選擇條件變數中,才能確定下一步的流轉路徑。這樣的處理過程是經常的一種業務場景。一個有中間事件類型節點的流程圖示意如下:

 

2.2 節點上事件的定義

        在流程設計器中,節點上的事件定義主要有兩個屬性:事件觸發的位置(執行前和執行後)、以及事件執行的表達式。一個定義示例描述如下:

        觸發位置:執行前

        表達式:Slickflow.Module.External.OrderSubmitService

2.3 業務服務的代碼實現

        上文中提到的表達式是業務服務的程式代碼,業務服務的邏輯實現,除了本身的功能代碼實現,還需要繼承如下的兩個介面: ExternalServiceBase 和 IExternalService。 主要用於明確定義Execute()執行方法,然後在引擎內部執行過程中,在調用和執行這個介面方法。具體代碼示例如下:

 /// <summary>
    /// 訂單提交服務類(對應訂單流程中訂單提交節點)
    /// </summary>
    public class OrderSubmitService : ExternalServiceBase, IExternalService
    {
        /// <summary>
        /// 業務邏輯前置調用方法
        /// </summary>
        public override void Execute()
        {
            //實現用戶自己的業務邏輯
            var id = DelegateService.GetID();
            var amount = DelegateService.GetVariable("amount");

            DoSomethingElse(amount, 20);
        }

        /// <summary>
        /// 業務邏輯具體實現方法
        /// </summary>
        /// <param name="amount"></param>
        /// <param name="newAmount"></param>
        private void DoSomethingElse(string amount, int newAmount)
        {
            var intAmount = 0;
            int.TryParse(amount, out intAmount);

            if (intAmount < newAmount)
            {
                DelegateService.SetVariable("amount", newAmount.ToString());
            }

            //調用其它業務處理邏輯
            var session = DelegateService.GetSession();

            //實現其它資料庫業務邏輯
            //.............................
        }
    }

   

3. 委托服務的內部機制

        委托服務用於統一處理所有流程發生的時間,跟事件交互過程中,除了觸發事件本身以外,還要考慮引擎內部和外部業務系統之間的交互。比如流程變數的保存和讀取就是一種交互應用。

3.1 委托服務介面

        委托服務介面定義出事件訂閱時候的介面類型,具體代碼如下:

 /// <summary>
    /// 委托介面
    /// </summary>
    public interface IDelegateService
    {
        int ID { get; set; }
        int GetID();
        IDbSession GetSession();
        string GetVariable(string name, Nullable<ScopeTypeEnum> scopeType = null);
        void SetVariable(string name, string value, Nullable<ScopeTypeEnum> scopeType = null);
        string GetCondition(string name);
        void SetCondition(string name, string value);
        T GetInstance<T>(int id) where T : class;
    }

3.2 委托服務繼承類

        繼承委托服務的介面實現目前有兩種類型,一是流程委托服務介面,而是活動委托服務介面。實現的主要目的是對流程變數的讀取和存儲,還有給外部應用展示流程實例的關鍵信息。

4. 流程變數

        流程變數是流程流轉過程發生的一些數據變化,這些變數一般是來自業務系統的關鍵參數,而且在流程流轉時,通過條件表達式傳入,可以決定流程流轉下一步的路徑選擇。

4.1 流程變數類型

        流程變數類型分為全局變數和局部變數。在程式中也可以命名為流程變數(ProcessVariable)和活動變數(ActivityVariable)。

4.2 流程變數存儲

        流程變數的存儲是持久化存儲在資料庫表(WfProcessVariables)中,變數名和數值的key-value是其記錄格式。

 delegateService.SetVariable("name", "book-task1");
 delegateService.SetVariable("amount", "50");

  

5. 總結

        流程引擎跟外部事件的交互實現,可以豐富業務過程的狀態變化和響應,通過流程變數的存儲,記錄業務過程中的關鍵數據變化,同時也做到了對流程分支選擇的路徑跟蹤。程式開發人員可以通過實現外部事件的委托服務,然後再訂閱流程過程事件,來徹底實現業務系統跟引擎內部的進一步協作整合。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 下麵給出簡單的代碼,這裡通過將變數重置為零來實現過濾欄位的目的: 如果不希望使用二次映射,可以考慮使用reflect庫中,Value結構體的FieldByName成員函數。 ...
  • 適配器模式的定義:將一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠一起工作。 圖解: A、B兩個圖框代表已經塑模成型的物體A和物體B,現在要求把A和B安裝在一起使用,如何安裝?兩者的介面不一致,是不可能安裝在一起使用的,那怎麼辦?引入一個物體C,如下: ...
  • 初學laravel常常看到諸如依賴註入、控制反轉等名詞一臉懵逼,望而生畏,用了一段時間後才明白這些基本的原理,原理其實並不難,關鍵在於怎麼理解。 ...
  • 單一職責原則(Single Responsibility Principle),簡稱SRP。 定義:一個類只負責一件事情; 說明:類的單一職責原則受多重因素制約,實際實現起來,需要考慮項目工期、成本、人員技術水平等 使用:介面一定要做到單一職責原則,類的設計儘量做到單一職責原則 擴展:單一職責原則同 ...
  • 困擾 Intellij idea是一款非常強大的編輯器,可以很方便地幫我們創建maven項目,有用過的同學應該都深有體會,但我們經常會遇到一個困擾,那就是用idea創建maven項目時,速度很慢,往往需要好幾分鐘的時間,有時甚至會卡住,主要原因是創建maven項目時預設是下載求網路上的一個文件arc ...
  • 如果這是第二次看到我的文章,歡迎右側掃碼訂閱我喲~ 👉 本文長度為3012字,建議閱讀8分鐘。 堅持原創,每一篇都是用心之作~ 下麵的這個場景你可能會覺得很熟悉(Z哥我又要出演了): Z哥:@All 兄弟姐妹們,這次我這邊有個需求需要給「商品上架」增加一道審核,會影響到大家和我交互的介面。大家抽空 ...
  • 1 初步認識 適配器模式的定義 將一個類的介面轉成客戶期望的另外一個介面。適配器模式使得原本由於介面不匹配而不能一起工作的那些類可以一起工作。 大白話 適配器模式就像旅行插座轉換器(圖1)、Type-c轉VGA轉介面(圖4)一樣。 圖1. 圖片來源網路 圖2. 圖片來源網路 去過香港迪拜等的同學都知 ...
  • Nginx 介紹:高性能的http伺服器和反向代理(請求通過反向代理之後,訪問伺服器端的邏輯)如下圖所示: Ningx的作用 負載均衡 所謂負載就是伺服器各項技術所承受的壓力 均衡,平均分配壓力(物理平均,邏輯平均) 通過輪訓機制來達到物理均衡 動靜分離 伺服器可以處理動態資源(tomcat jsp ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...