日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

強(qiáng)烈推薦強(qiáng)大的規(guī)則引擎框架LiteFlow

來源: 責(zé)編: 時間:2024-02-29 14:43:50 182觀看
導(dǎo)讀環(huán)境:SpringBoot2.7.161. 簡介LiteFlow是一個非常強(qiáng)大的現(xiàn)代化的規(guī)則引擎框架,融合了編排特性和規(guī)則引擎的所有特性。在每個公司的系統(tǒng)中,總有一些擁有復(fù)雜業(yè)務(wù)邏輯的系統(tǒng),這些系統(tǒng)承載著核心業(yè)務(wù)邏輯,幾乎每個需求都和這

環(huán)境:SpringBoot2.7.16mnT28資訊網(wǎng)——每日最新資訊28at.com


1. 簡介

LiteFlow是一個非常強(qiáng)大的現(xiàn)代化的規(guī)則引擎框架,融合了編排特性和規(guī)則引擎的所有特性。mnT28資訊網(wǎng)——每日最新資訊28at.com

在每個公司的系統(tǒng)中,總有一些擁有復(fù)雜業(yè)務(wù)邏輯的系統(tǒng),這些系統(tǒng)承載著核心業(yè)務(wù)邏輯,幾乎每個需求都和這些核心業(yè)務(wù)有關(guān),這些核心業(yè)務(wù)業(yè)務(wù)邏輯冗長,涉及內(nèi)部邏輯運(yùn)算,緩存操作,持久化操作,外部資源調(diào)取,內(nèi)部其他系統(tǒng)RPC調(diào)用等等。時間一長,項(xiàng)目幾經(jīng)易手,維護(hù)成本就會越來越高。各種硬代碼判斷,分支條件越來越多。代碼的抽象,復(fù)用率也越來越低,各個模塊之間的耦合度很高。一小段邏輯的變動,會影響到其他模塊,需要進(jìn)行完整回歸測試來驗(yàn)證。如要靈活改變業(yè)務(wù)流程的順序,則要進(jìn)行代碼大改動進(jìn)行抽象,重新寫方法。實(shí)時熱變更業(yè)務(wù)流程,幾乎很難實(shí)現(xiàn)。LiteFlow為解耦邏輯而生,為編排而生,在使用LiteFlow之后,你會發(fā)現(xiàn)打造一個低耦合,靈活的系統(tǒng)會變得易如反掌!mnT28資訊網(wǎng)——每日最新資訊28at.com

LiteFlow優(yōu)勢

利用LiteFlow,你可以將瀑布流式的代碼,轉(zhuǎn)變成以組件為核心概念的代碼結(jié)構(gòu),這種結(jié)構(gòu)的好處是可以任意編排,組件與組件之間是解耦的,組件可以用腳本來定義,組件之間的流轉(zhuǎn)全靠規(guī)則來驅(qū)動。LiteFlow擁有開源規(guī)則引擎最為簡單的DSL語法。十分鐘就可上手。mnT28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

組件可實(shí)時熱更替,也可以給編排好的邏輯流里實(shí)時增加一個組件,從而改變你的業(yè)務(wù)邏輯。mnT28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

LiteFlow的腳本組件,支持眾多腳本語言,完全和Java打通,你可以用腳本來實(shí)現(xiàn)任何邏輯。mnT28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

LiteFlow支持把編排規(guī)則和腳本放在數(shù)據(jù)庫,注冊中心中,還有可以任意擴(kuò)展的接口,方便你定制。mnT28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

LiteFlow支持你能夠想象處理的任何邏輯流程,如下流程:mnT28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

規(guī)則文件

LiteFlow支持3中格式的規(guī)則文件定義:XML,JSON,YML。以下是XML示例:mnT28資訊網(wǎng)——每日最新資訊28at.com

<?xml versinotallow="1.0" encoding="UTF-8"?><flow>    <chain name="example_01">        THEN(a, b, c)    </chain></flow>

規(guī)則說明

THNE:串行執(zhí)行,a執(zhí)行===》執(zhí)行b===》執(zhí)行cmnT28資訊網(wǎng)——每日最新資訊28at.com

WHEN:并行執(zhí)行mnT28資訊網(wǎng)——每日最新資訊28at.com

<chain name="chain1">    WHEN(a, b, c);</chain>

SWITCH:選擇執(zhí)行mnT28資訊網(wǎng)——每日最新資訊28at.com

<chain name="chain1">    SWITCH(a).to(b, c, d);</chain>

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

IF:條件執(zhí)行mnT28資訊網(wǎng)——每日最新資訊28at.com

IF二元mnT28資訊網(wǎng)——每日最新資訊28at.com

<chain name="chain1">    THEN(        IF(x, a),        b    );</chain>

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

其中x為條件節(jié)點(diǎn),為真的情況下,執(zhí)行鏈路就為x->a->b,為假鏈路就為x->b。mnT28資訊網(wǎng)——每日最新資訊28at.com

IF三元mnT28資訊網(wǎng)——每日最新資訊28at.com

<chain name="chain1">    THEN(        IF(x, a, b),        c    );</chain>

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

還有其它很多的規(guī)則,這里不一一舉例,可以查看官網(wǎng)。mnT28資訊網(wǎng)——每日最新資訊28at.com

2. 實(shí)戰(zhàn)案例

環(huán)境配置mnT28資訊網(wǎng)——每日最新資訊28at.com

<dependency>  <groupId>com.yomahub</groupId>  <artifactId>liteflow-spring-boot-starter</artifactId>  <version>2.11.4.2</version></dependency>

配置文件mnT28資訊網(wǎng)——每日最新資訊28at.com

#liteflow 配置liteflow:  rule-source: flows/*.el.xml


mnT28資訊網(wǎng)——每日最新資訊28at.com

整個規(guī)則流程執(zhí)行如下mnT28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com


mnT28資訊網(wǎng)——每日最新資訊28at.com

規(guī)則定義mnT28資訊網(wǎng)——每日最新資訊28at.com

<?xml versinotallow="1.0" encoding="UTF-8"?><flow>    <chain name="processOrder">        THEN(          initOrder,           IF(amount, discountOrder),          SWITCH(userType).to(vipDiscountOrder, normalDiscountOrder),          completeOrder        )    </chain></flow>

這里的initOrder,amount,discountOrder等都是具體Node接口是bean的名稱。mnT28資訊網(wǎng)——每日最新資訊28at.com

初始化訂單組件

@Component("initOrder")public class InitOrderComponent extends NodeComponent {  @Override  public void process() {    System.out.println("初始化訂單...") ;    Order order = this.getContextBean(Order.class) ;    double sum = order.getItems().stream().mapToDouble(item -> {      return item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())).doubleValue() ;    }).sum() ;    order.setTotalAmount(BigDecimal.valueOf(sum));  }}

這里只做了計算訂單總額。mnT28資訊網(wǎng)——每日最新資訊28at.com

判斷訂單總額節(jié)點(diǎn)
mnT28資訊網(wǎng)——每日最新資訊28at.com

@Component("amount")public class AmountComponent extends NodeIfComponent {  @Override  public boolean processIf() throws Exception {    System.out.println("判斷總金額,超過100元打折") ;    Order order = this.getContextBean(Order.class) ;    return order.getTotalAmount().doubleValue() >= 100D ;  }}

用戶類型判斷,執(zhí)行哪個節(jié)點(diǎn)mnT28資訊網(wǎng)——每日最新資訊28at.com

@Component("userType")public class UserTypeComponent extends NodeSwitchComponent {  @Override  public String processSwitch() throws Exception {    User user = this.getContextBean(User.class) ;    if (user.isVip()) {      return "vipDiscountOrder" ;    }    return "normalDiscountOrder" ;  }}

上面返回的是具體節(jié)點(diǎn)的beanName。mnT28資訊網(wǎng)——每日最新資訊28at.com

VIP折扣節(jié)點(diǎn)
mnT28資訊網(wǎng)——每日最新資訊28at.com

@Component("vipDiscountOrder")public class VIPDiscountOrderComponent extends NodeComponent {  @Override  public void process() {    System.out.println("VIP會員打9折") ;    Order order = this.getContextBean(Order.class) ;    order.setTotalAmount(order.getTotalAmount().multiply(BigDecimal.valueOf(9)).divide(BigDecimal.valueOf(10), RoundingMode.HALF_UP)) ;  }}

普通會員折扣節(jié)點(diǎn)mnT28資訊網(wǎng)——每日最新資訊28at.com

@Component("normalDiscountOrder")public class NormalDiscountOrderComponent extends NodeComponent {  @Override  public void process() {    System.out.println("普通會員不打折") ;  }}

完成節(jié)點(diǎn)mnT28資訊網(wǎng)——每日最新資訊28at.com

@Component("completeOrder")public class CompleteOrderComponent extends NodeComponent  {  @Override  public void process() throws Exception {    System.out.println("訂單折扣執(zhí)行完成,最后收尾...") ;  }}

以上是該規(guī)則流程的所有配置及定義。接下來進(jìn)行測試mnT28資訊網(wǎng)——每日最新資訊28at.com

// 直接注入該類進(jìn)行規(guī)則流程的啟動執(zhí)行@Resourceprivate FlowExecutor flowExecutor;@Testpublic void testExample02() {  Order order = new Order() ;  order.setId(1L) ;  order.setSno("S001") ;  List<OrderItem> items = new ArrayList<>() ;  items.add(new OrderItem(1L, 2, BigDecimal.valueOf(22))) ;  items.add(new OrderItem(2L, 1, BigDecimal.valueOf(24.5))) ;  items.add(new OrderItem(3L, 5, BigDecimal.valueOf(66.3))) ;  order.setItems(items) ;  User user = new User() ;  user.setId(1L) ;  user.setVip(false) ;  LiteflowResponse response = flowExecutor.execute2Resp("processOrder", null, order, user);  if (!response.isSuccess()) {    Exception e = response.getCause() ;    e.printStackTrace() ;  } else {    System.out.println("流程成功執(zhí)行...") ;    System.out.println("最終應(yīng)付款:" + response.getContextBean(Order.class).getTotalAmount().doubleValue()) ;  }}

控制臺將會輸出詳細(xì)的信息。mnT28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

修改用戶類型后執(zhí)行mnT28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mnT28資訊網(wǎng)——每日最新資訊28at.com

以上是本篇文章的全部內(nèi)容,希望對你有所幫助。mnT28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-75360-0.html強(qiáng)烈推薦強(qiáng)大的規(guī)則引擎框架LiteFlow

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Vue3問題:如何實(shí)現(xiàn)拼圖驗(yàn)證+郵箱登錄功能?前后端!

下一篇: 掌握 Python 棧,輕松實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 阿拉善右旗| 兴仁县| 纳雍县| 界首市| 大竹县| 大化| 柯坪县| 汉中市| 安顺市| 沛县| 囊谦县| 原阳县| 玉龙| 安庆市| 曲麻莱县| 黄骅市| 清镇市| 清河县| 抚州市| 锦屏县| 玉林市| 大港区| 长阳| 河北区| 阳原县| 平阳县| 赣州市| 邵阳市| 长丰县| 天台县| 沁水县| 鹤岗市| 炉霍县| 郓城县| 饶河县| 上虞市| 保靖县| 客服| 桂阳县| 额尔古纳市| 崇信县|