規則引擎LiteFlow發布v2.12.1版本,決策路由特性

個人博客:無奈何楊(wnhyang)

個人語雀:wnhyang

共享語雀:在線知識共享

Github:wnhyang - Overview


簡介

標題其實是不準確的,了解過的會知道在LiteFlow2.12.0已經有了決策路由的特性,但我為什么標題這么講呢?且往下看。

因為這篇文章LF的重磅特性預告:決策路由,我一直期待著決策路由功能的發布,終于有一天它發布了!

決策路由特性來襲,LiteFlow大版本2.12.0發布,Make your code amaing!。

雖然這次是大更新,發布的不只是決策路由,但是我心心念念的決策路由并沒有我期待的那樣好用,因為這個版本的路由是全局匹配,沒有分組或分級的概念,在實際使用中并不那么好用。雖然能通過一些代碼來實現類似的分組功能,但是肯定不如框架實現的好,同時也不想因此將代碼來回變動,所以通過社區向作者提意見,正好作者早有此想法,非常nice!

這次規則引擎LiteFlow發布v2.12.1版本,有多猛用過才知道,2.12.1版本帶來此功能,我也默默的將許久未編輯的《LiteFlow大版本2.12.0發布,決策路由發布》的文章重命名了標題《規則引擎LiteFlow發布v2.12.1版本,決策路由特性》。

參考

🏖概念以及介紹 | LiteFlow

2.12.0升級指南 | LiteFlow

決策路由

說明

關于LiteFlow,不想再過多介紹了。之前的文章也有說明了風控系統之普通規則條件,使用LiteFlow實現。

非常推薦通過官網來學習,很有幫助!

路由嘛,知道Nginx吧,可以理解為location的配置,不知道Nginx,類比微服務網關也一樣。

2.12.0版本加入了路由特性,新增了routebody標簽。

<chain name="chain1"><route>AND(r1, r2, r3)</route><body>THEN(a, b, c);</body>
</chain><chain name="chain2"><route>AND(OR(r4, r5), NOT(r3))</route><body>SWITCH(x).TO(d, e, f);</body>
</chain>

同時提供了專門用于執行路由chain的方法。

List<LiteflowResponse> responseList = flowExecutor.executeRouteChain(requestData, YourContext.class);

在此版本中存在一個很大的問題,或者說是不便。

此方法會執行所有的路由chain,那么所有的路由chain就被限制住了。

舉個例子,如果業務需要如下這樣決策流程,數據接入后想利用決策路由的特性確定跑哪個策略集,到這里決策路由還是很有用的,但是策略集下其實還有很多規則的,進入策略集后應該還要繼續進行決策路由,并行跑所有規則。那么這里就出問題了,因為策略集路由明顯和規則路由不是一個概念,而且還不能同時跑,是要策略路由跑完后再進行規則路由的。

LiteFlow2.12.1版本,加入了路由分組管理。

<chain name="chain1" namespace="n1"><route>AND(r1, r2, r3)</route><body>THEN(a, b, c);</body>
</chain>

同時加入執行分組的方法,很好的解決了此問題。

List<LiteflowResponse> responseList = flowExecutor.executeRouteChain("n1", requestData, YourContext.class);

但是

就那上面這張圖舉例子,步驟有:

1、數據接入

2、判斷要執行哪個策略集(唯一)

3、判斷要執行策略下的哪些規則(多個)

原先判斷要執行哪個策略集需要硬編碼確認,有了決策路由就可以配置好route,每個策略集route分配好唯一的namespace,如:每個策略集namespace命名可以是ss-${appName}-${strategySetCode}ssstrategySet的簡寫,標識namespace屬于策略集,唯一性由${appName}-${strategySetCode}動態決定。判斷要執行策略下哪些規則的namespace可以命名為rule-${strategyId}rule代表規則路由,后面拼上策略id用于確認規則在哪個策略下,這樣確認策略后就可以并行多個執行了。

但寫著寫著發現還有一個問題,當前決策路由執行好像只有這個方法,沒有提供隱式子流程調用,也就說現在執行多個路由只能在不同的流程內,策略集流程執行后如果要執行規則流程的話,只能另行執行路由,兩個流程獨立開了,這樣對我來講其實是不對的,因為它們是公用上下文的,在同一流程內很有必要。

這個只能暫時期待住了,好像確實沒有好的辦法,有個方法是上下文復制傳下去,但這又和LiteFlow組件化,上下文的思想違背了,和普通的瀑布流程好像又是一樣的了,而且將兩個流程割裂了,不太好。

flowExecutor.executeRouteChain("n1", requestData, YourContext.class);

上下文參數注入

上下文是LiteFlow中一個非常重要的概念,詳細請查看官網🍄說明 | LiteFlow。

上下文參數注入之適用于聲明式組件,聲明式組件請看官網🥭什么叫聲明式組件 | LiteFlow。

哈哈哈,全是看官網。。。

示例

在過去,沒有上下文參數注入時,通過聲明式組件獲取上下文是這樣的。

@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "accessIn", nodeType = NodeTypeEnum.COMMON)
public void accessIn(NodeComponent bindCmp) {DecisionRequest decisionRequest = bindCmp.getContextBean(DecisionRequest.class);// 處理入參Map<String, String> params = decisionRequest.getParams();log.info("入參:{}", params);...}

而有了上下文參數注入特性后就可簡化,如下。

@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "accessIn", nodeType = NodeTypeEnum.COMMON)
public void accessIn(NodeComponent bindCmp, @LiteflowFact("params") Map<String, String> params) {log.info("入參:{}", params);}

@LiteflowFact中寫的表達式,會自動的從上下文中搜索相應的參數。即使你有多個上下文,也無需去指定上下文。

但是有一種情況,在使用時要注意:假設你有兩個上下文,TestContext1TestContext2,在這兩個上下文里都有user這個對象,并且兩個user里的信息是不一樣的。這時你通過@LiteflowFact("user") User user這樣去拿,拿到的是第一個user,在不同環境上可能還不一樣。

所以使用上下文參數注入特性時,如果有多個上下文,請確保注入的對象,在多個上下文中只有一份,否則會有錯亂情況。

其實它的意義不僅僅是“簡化”,對我來講它其實是解放了聲明式組件,原來在我們編寫了聲明式組件后,他就只是個LiteFlow組件了,甚至不能做其他事情了。

如上例子public void accessIn(NodeComponent bindCmp),方法體中使用到了bindCmp獲取上下文,并使用這個上下文執行某些流程。這樣的話這個方法就困死在LiteFlow組件中了,因為我們并沒有這個bindCmp傳進方法內。而加入了上下文參數注入后,此方法就變為public void accessIn(NodeComponent bindCmp, @LiteflowFact("params") Map<String, String> params),看似好像只是加了一個參數,其實也是加了個參數😂但是因為這個參數,間接的解放了此方法,這時我們再調用此方法不用關心bindCmp了(前提是方法體中沒用到這個),關注@LiteflowFact修飾的參數即可。

寫在最后

拙作艱辛,字句心血,望諸君垂青,多予支持,不勝感激。


個人博客:無奈何楊(wnhyang)

個人語雀:wnhyang

共享語雀:在線知識共享

Github:wnhyang - Overview

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23493.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【TB作品】MSP430 G2553 單片機口袋板,讀取單片機P1.4電壓顯示,ADC,電壓表

功能 讀取P1.4電壓&#xff0c;顯示到口袋板顯示屏&#xff0c;電壓越高亮燈越多。 部分程序 while (1){ADC10CTL0 | ENC ADC10SC; // Sampling and conversion startLPM0;adcvalue ADC10MEM; //原始數據 0到1023adtest (float) adcvalue / 1024.…

【算法訓練 day48 零錢兌換、完全平方數】

目錄 一、零錢兌換-LeetCode 322思路實現代碼問題總結 二、完全平方數-LeetCode 279思路實現代碼問題總結 一、零錢兌換-LeetCode 322 Leecode鏈接: leetcode 322 文章鏈接: 代碼隨想錄 視頻鏈接: B站 給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及…

每一個企業,都值得擁有自己專屬的AI大模型!

前言 在數字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遙不可及的科幻概念&#xff0c;而是成為了企業創新、轉型、升級的必備工具。尤其是AI大模型&#xff0c;憑借其強大的數據處理能力和深度學習能力&#xff0c;正在為企業帶來前所未有…

【2024最新華為OD-C/D卷試題匯總】[支持在線評測] 字符串序列判定(100分) - 三語言AC題解(Python/Java/Cpp)

?? 大家好這里是清隆學長 ,一枚熱愛算法的程序員 ? 本系列打算持續跟新華為OD-C/D卷的三語言AC題解 ?? ACM銀牌??| 多次AK大廠筆試 | 編程一對一輔導 ?? 感謝大家的訂閱? 和 喜歡?? ??在線評測鏈接 字符串序列判定(100分) ?? 評測功能需要訂閱專欄后私信聯系…

Leetcode:四數之和

題目鏈接&#xff1a;18. 四數之和 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;排序 雙指針&#xff09; 主旨&#xff1a;類似于三數之和的解法&#xff0c;但需要多加一些限制&#xff0c;同時為了防止多個數組元素的相加之和出現整型溢出問題還要將整型…

基于python可伸縮JSON格式列表實現

對于消息體為一個json格式列表&#xff0c;列表長度變化的代碼設計&#xff0c;如下實現可供參考。 1、python語言實現(直接取值) #codingutf-8n 2 # 行項目數 productCode [11111,222222,333333] unit [H06,H07,H08] qty [6,7,8] items []for i in range(0, n):item …

數據分析每周挑戰——心衰患者特征數據集

這是一篇關于醫學數據的數據分析&#xff0c;但是這個數據集數據不是很多。 背景描述 本數據集包含了多個與心力衰竭相關的特征&#xff0c;用于分析和預測患者心力衰竭發作的風險。數據集涵蓋了從40歲到95歲不等年齡的患者群體&#xff0c;提供了廣泛的生理和生活方式指標&a…

spring事務實現原理

Spring事務的實現原理主要是基于AOP&#xff08;面向切面編程&#xff09; 事務的開啟與提交/回滾 開啟事務&#xff1a;當Spring容器中的AOP代理檢測到一個匹配的切點方法被調用時&#xff0c;它會首先開啟一個新的事務或者加入到現有的事務中&#xff08;這取決于事務傳播行…

【讀腦儀game】

讀腦儀&#xff08;Brain-Computer Interface&#xff0c;BCI&#xff09;游戲是一種利用腦電信號來控制游戲的新型交互方式。這類游戲通常需要專業的硬件設備來讀取用戶的腦電信號&#xff0c;并將這些信號轉化為游戲中的控制信號。編寫這樣的游戲代碼涉及到多個方面&#xff…

瀚高數據庫相關設置

瀚高數據庫相關設置 一、配置瀚高數據庫局域網訪問 需要修改兩個文件&#xff1a;postgresql.conf和pg_hba.conf 1&#xff09;在postgresql.conf中找到下述配置&#xff0c;把listen_addresses前面的注釋去掉&#xff0c;值修改為* # - Connection Settings -#listen_addresse…

IO進程線程(九)線程的同步 進程間通信

文章目錄 一、 線程的同步&#xff08;一&#xff09;無名信號量sem1. 定義和初始化2.獲取信號量3.釋放信號量4. 銷毀5. 使用示例 &#xff08;二&#xff09;條件變量1. 定義和初始化2. 獲取條件變量3. 釋放條件變量4. 銷毀條件變量 二、進程間通信&#xff08;一&#xff09;…

web-上傳項目文件夾到Git遠程倉庫

Git初識 概念&#xff1a;一個免費開源&#xff0c;分布式的代碼版本控制系統&#xff0c;幫助開發團隊維護代碼 作用&#xff1a;記錄代碼內容&#xff0c;切換代碼版本&#xff0c;多人開發時高效合并代碼內容 檢驗成功 打開bash終端&#xff08;git專用&#xff09;命令…

12. MySQL 日志

文章目錄 【 1. 日志的基本原理 】【 2. 錯誤日志 Error Log 】2.1 啟動和設置錯誤日志2.2 查看錯誤日志2.3 刪除錯誤日志 【 3. 二進制日志 Binary Log 】3.1 啟動和設置二進制日志3.2 查看二進制日志3.3 刪除二進制文件刪除所有二進制日志刪除小于指定編號的二進制日志刪除創…

【vue3+pinia+uniapp項目問題:使用pinia狀態管理時store的數據更新,模板渲染視圖不能實時更新】

在這里選擇不同的學校后&#xff0c;發現store里面的數據打印出來能更新&#xff0c;但是使用store的數據打印出來并未實時更新且渲染在模板上&#xff0c;必須手動刷新視圖才能更新。 原因是因為使用了解構賦值傳入參數 解決方法 1.使用computed 現在視圖能進行實時更新…

分享一個 .Net core Console 項目使用 SqlSugar 的詳細例子

前言 SqlSugar 是一款老牌的 .NET 開源 ORM 框架&#xff0c;性能高&#xff0c;功能全面&#xff0c;使用簡單&#xff0c;支持 .NET FrameWork、.NET Core3.1、.NET5、.NET6、.NET7、.NET8、.NET9 等版本&#xff0c;線上論壇非常活躍&#xff0c;今天給大伙分享一個 .Net c…

查看遠程桌面端口,查看服務器的遠程桌面端口的方法

如果你正在尋找一種方法來檢查服務器的遠程桌面端口&#xff0c;那么請務必按照以下步驟操作&#xff0c;以確保準確且安全地獲取所需信息。這不僅是一個技術問題&#xff0c;更是一個關于效率和安全性的重要議題。 首先&#xff0c;你需要明確&#xff0c;遠程桌面端口通常是…

回溯算法之遞增子數列

題目&#xff1a; 給你一個整數數組 nums &#xff0c;找出并返回所有該數組中不同的遞增子序列&#xff0c;遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案。 數組中可能含有重復元素&#xff0c;如出現兩個整數相等&#xff0c;也可以視作遞增序列的一種特殊情…

【數據結構與算法 | 二叉樹篇】二叉樹的前中后序遍歷(迭代版本)

1. 前言 前文我們實現了二叉樹前中后三種遍歷方式的遞歸版本&#xff0c;非常簡單. 接下來我們來實現一下其迭代版本. 2. 二叉樹的前序遍歷 (1). 題 給你二叉樹的根節點 root &#xff0c;返回它節點值的 前序 遍歷。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2…

語音技能云云接入通用平臺

Cloud-to-Cloud(云云接入) 前言 項目地址&#xff1a;https://github.com/LeYunone/cloud-to-cloud 配置說明&#xff1a;https://leyunone.com/github-project/voice-cloud-cloud-config.html 注&#xff1a;學習測試以及使用請拉取 master 分支&#xff0c;release 是開發…

python pip 安裝

如果您不確定pip的安裝路徑&#xff0c;可以通過以下命令來查詢&#xff1a; pip show pip 這個命令會顯示pip的詳細信息&#xff0c;其中包括pip安裝的路徑。如果您想修改pip的默認安裝路徑&#xff0c;可以使用pip的"--target"參數指定目標路徑&#xff0c;例如&a…