成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

強烈推薦強大的規則引擎框架LiteFlow

開發 前端
利用LiteFlow,你可以將瀑布流式的代碼,轉變成以組件為核心概念的代碼結構,這種結構的好處是可以任意編排,組件與組件之間是解耦的,組件可以用腳本來定義,組件之間的流轉全靠規則來驅動。LiteFlow擁有開源規則引擎最為簡單的DSL語法。

環境:SpringBoot2.7.16


1. 簡介

LiteFlow是一個非常強大的現代化的規則引擎框架,融合了編排特性和規則引擎的所有特性。

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

LiteFlow優勢

利用LiteFlow,你可以將瀑布流式的代碼,轉變成以組件為核心概念的代碼結構,這種結構的好處是可以任意編排,組件與組件之間是解耦的,組件可以用腳本來定義,組件之間的流轉全靠規則來驅動。LiteFlow擁有開源規則引擎最為簡單的DSL語法。十分鐘就可上手。

圖片圖片

組件可實時熱更替,也可以給編排好的邏輯流里實時增加一個組件,從而改變你的業務邏輯。

圖片圖片

LiteFlow的腳本組件,支持眾多腳本語言,完全和Java打通,你可以用腳本來實現任何邏輯。

圖片圖片

LiteFlow支持把編排規則和腳本放在數據庫,注冊中心中,還有可以任意擴展的接口,方便你定制。

圖片圖片

LiteFlow支持你能夠想象處理的任何邏輯流程,如下流程:

圖片圖片

圖片圖片

規則文件

LiteFlow支持3中格式的規則文件定義:XML,JSON,YML。以下是XML示例:

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

規則說明

THNE:串行執行,a執行===》執行b===》執行c

WHEN:并行執行

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

SWITCH:選擇執行

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

圖片圖片

IF:條件執行

IF二元

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

圖片圖片

其中x為條件節點,為真的情況下,執行鏈路就為x->a->b,為假鏈路就為x->b。

IF三元

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

圖片圖片

還有其它很多的規則,這里不一一舉例,可以查看官網。

2. 實戰案例

環境配置

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

配置文件

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


整個規則流程執行如下

圖片圖片


規則定義

<?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的名稱。

初始化訂單組件

@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));
  }
}

這里只做了計算訂單總額。

判斷訂單總額節點

@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 ;
  }


}

用戶類型判斷,執行哪個節點

@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" ;
  }


}

上面返回的是具體節點的beanName。

VIP折扣節點

@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)) ;
  }
}

普通會員折扣節點

@Component("normalDiscountOrder")
public class NormalDiscountOrderComponent extends NodeComponent {


  @Override
  public void process() {
    System.out.println("普通會員不打折") ;
  }
}

完成節點

@Component("completeOrder")
public class CompleteOrderComponent extends NodeComponent  {


  @Override
  public void process() throws Exception {
    System.out.println("訂單折扣執行完成,最后收尾...") ;
  }


}

以上是該規則流程的所有配置及定義。接下來進行測試

// 直接注入該類進行規則流程的啟動執行
@Resource
private FlowExecutor flowExecutor;


@Test
public 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("流程成功執行...") ;
    System.out.println("最終應付款:" + response.getContextBean(Order.class).getTotalAmount().doubleValue()) ;
  }
}

控制臺將會輸出詳細的信息。

圖片圖片

修改用戶類型后執行

圖片圖片

以上是本篇文章的全部內容,希望對你有所幫助。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2020-02-24 10:06:43

Mac軟件工具

2023-12-22 14:09:08

AI文本編輯器AiEditor

2011-06-30 17:41:46

SEO

2025-03-26 04:00:01

2009-11-04 13:12:33

VB.NET繼承類

2023-07-10 08:44:00

2011-04-21 14:42:46

CSSHTML工具

2011-05-16 08:37:56

JavaScript庫

2012-02-03 15:13:27

JavaScript

2011-07-06 13:38:42

Web

2025-05-13 04:15:00

2012-06-14 11:14:14

運維Firefox插件

2014-04-11 13:12:10

前端技能前端必備

2022-05-16 09:20:00

開發工具

2020-02-16 10:45:30

Chrome數據火狐

2020-12-17 05:52:09

線程池ThreadPoolThreadPoolE

2022-09-07 11:38:04

async代碼前端

2009-11-04 13:46:36

ADO.NET數據庫

2023-12-07 19:13:48

Pythonprint

2020-02-24 19:40:22

WindowsSSH客戶端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费福利 | 午夜免费在线电影 | 麻豆av电影网 | 亚洲在线一区 | 亚洲国产一区二区三区, | 欧美视频1| 亚洲一区二区三区免费在线 | 777777777亚洲妇女 | 亚洲一区二区三区视频 | 青青草在线播放 | 91色综合 | 欧美日韩亚洲视频 | 一区二区三区精品视频 | 亚洲欧美视频一区 | 国产一二区视频 | 在线看一区二区 | 91精品国产综合久久小仙女图片 | 水蜜桃久久夜色精品一区 | 久久精品99久久 | 国产精品久久久久久久午夜片 | 成人h片在线观看 | 成人特级毛片 | 午夜精品视频一区 | 超碰日韩 | 欧美三级免费观看 | 国产一级片一区二区 | 草草影院ccyy| 亚洲一区二区成人 | 精品欧美黑人一区二区三区 | 一区二区三区在线 | 成人在线观看中文字幕 | 福利在线观看 | 三级高清 | 国产精品久久免费观看 | 精品免费av | 亚洲成人免费视频在线 | 超碰在线免费av | 毛片一级片 | 中文字幕a√ | 久久九七| 久久久久久国产精品免费免费 |