最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成LiteFlow實(shí)現(xiàn)輕量級(jí)工作流引擎的詳細(xì)過(guò)程

 更新時(shí)間:2025年06月12日 14:31:56   作者:努力成為八股之神小澤  
LiteFlow 是一款專(zhuān)注于邏輯驅(qū)動(dòng)流程編排的輕量級(jí)框架,它以組件化方式快速構(gòu)建和執(zhí)行業(yè)務(wù)流程,有效解耦復(fù)雜業(yè)務(wù)邏輯,下面給大家介紹SpringBoot集成LiteFlow實(shí)現(xiàn)輕量級(jí)工作流引擎,感興趣的朋友一起看看吧

LiteFlow 是一款專(zhuān)注于邏輯驅(qū)動(dòng)流程編排的輕量級(jí)框架,它以組件化方式快速構(gòu)建和執(zhí)行業(yè)務(wù)流程,有效解耦復(fù)雜業(yè)務(wù)邏輯。通過(guò)支持熱加載規(guī)則配置,開(kāi)發(fā)者能夠即時(shí)調(diào)整流程步驟,將復(fù)雜的業(yè)務(wù)如價(jià)格計(jì)算、下單流程等拆分為獨(dú)立且可復(fù)用的組件,從而實(shí)現(xiàn)系統(tǒng)的高度靈活性與擴(kuò)展性。

一、基礎(chǔ)概念

1.1 組件(Component)

LiteFlow 的核心概念是組件,組件是業(yè)務(wù)邏輯的最小單元。每個(gè)組件都對(duì)應(yīng)一個(gè)具體的業(yè)務(wù)操作,例如“發(fā)送郵件”“計(jì)算價(jià)格”等。組件之間通過(guò)規(guī)則進(jìn)行編排,形成完整的業(yè)務(wù)流程。

liteflow 的組件在規(guī)則文件中即對(duì)應(yīng)的節(jié)點(diǎn),組件對(duì)應(yīng)的種類(lèi)有很多,具體的如下所示:

普通組件

普通組件需要集成的是 NodeComponent, 可以用在 when 和 then 邏輯中,具體的業(yè)務(wù)需要在 process 中去執(zhí)行。同時(shí)在 node 節(jié)點(diǎn)中,可以覆蓋 iaAccess 方法,表示是否進(jìn)入該節(jié)點(diǎn)執(zhí)行業(yè)務(wù)邏輯,isContinueOnError 判斷在出錯(cuò)的情況下是否繼續(xù)執(zhí)行下一個(gè)組件,默認(rèn)為 false。 isEnd 方法表示是否終止流程,默認(rèn)為true。

選擇組件

選擇組件是通過(guò)業(yè)務(wù)邏輯來(lái)判斷接下來(lái)的動(dòng)作要執(zhí)行哪一個(gè)節(jié)點(diǎn),類(lèi)似于 Java中的 switch , 在代碼中則需要繼承 NodeSwitchComponent 實(shí)現(xiàn) processWitch 方法來(lái)處理業(yè)務(wù)。

# flow 規(guī)則表達(dá)式 選擇組件
SWITCH(a).to(b, c);
# processWitch 表達(dá)式需要返回的是 b 或者 c 字符串來(lái)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯
# flow 規(guī)則表達(dá)式 條件組件
IF(x, a, b);

條件組件

條件組件稱(chēng)之為 if 組件,返回的結(jié)果是 true 或者 false, 代碼需要集成 NodeIfComponent 重寫(xiě) processIf 方法,返回對(duì)應(yīng)的業(yè)務(wù)節(jié)點(diǎn),這個(gè)和選擇組件類(lèi)似。

在官方文檔中,還有次數(shù)循環(huán)組件,條件循環(huán)組件,循環(huán)迭代組件,和退出循環(huán)組件,其應(yīng)用場(chǎng)景比較復(fù)雜,可以使用簡(jiǎn)單的普通組件來(lái)替代,畢竟是輕量級(jí)的規(guī)則引擎,主要作用就是為了編排流程順序,復(fù)雜的場(chǎng)景就升級(jí)使用工作流了

1.2 規(guī)則(Rule)

規(guī)則定義了組件之間的執(zhí)行順序和條件。LiteFlow 支持多種規(guī)則文件格式,如 XML、JSON、YAML 等,也支持從本地文件系統(tǒng)、數(shù)據(jù)庫(kù)、ZooKeeper、Nacos、Apollo 等多種方式加載規(guī)則。

在我上一段實(shí)習(xí)中,就是通過(guò)Apollo配置不同場(chǎng)景下的多種任務(wù)編排實(shí)現(xiàn)實(shí)時(shí)生效

# 文件編排, then 代表串行執(zhí)行  when 表示并行執(zhí)行
# 串行編排示例
THEN(a, b, c, d);
# 并行編排示例
WHEN(a, b, c);
# 串行和并行嵌套結(jié)合
THEN( a, WHEN(b, c, d), e);
# 選擇編排示例
SWITCH(a).to(b, c, d);
# 條件編排示例
THEN(IF(x, a),b );

1.3 上下文(Context)

上下文用于在組件之間傳遞數(shù)據(jù)。LiteFlow 提供了靈活的上下文機(jī)制,可以在流程執(zhí)行過(guò)程中存儲(chǔ)和共享數(shù)據(jù)。這里實(shí)際上在代碼里定義一個(gè)全局變量在整個(gè)流程中進(jìn)行流傳即可

1.4 參數(shù)配置

liteflow 中,需要配置的內(nèi)容有規(guī)則文件地址,節(jié)點(diǎn)重試(執(zhí)行報(bào)錯(cuò)時(shí)可以進(jìn)行重試,類(lèi)似于 spring-retry), 流程并行執(zhí)行線程池參數(shù)配置,流程的請(qǐng)求ID配置。

liteflow:
  # 規(guī)則文件 失敗重試次數(shù) 打印執(zhí)行日志 監(jiān)控日志
  ruleSource : liteflow/*.el.xml
  retry-count: 0
  print-execution-log: true
  monitor:
    enable-log: true
    period: 300000
  request-id-generator-class: com.platform.orderserver.config.AppRequestIdGenerator
  # 上下文的最大數(shù)量槽
  slot-size : 10240
  # 線程數(shù),默認(rèn)為64
  main-executor-works: 64
  # 異步線程最長(zhǎng)等待時(shí)間 秒
  when-max-wait-seconds: 15
  # when 節(jié)點(diǎn)全局異步線程池最大線程數(shù)
  when-max-workers: 16
  # when 節(jié)點(diǎn)全局異步線程池隊(duì)列數(shù)
  when-queue-limit: 5120
  # 在啟動(dòng)的時(shí)候就解析規(guī)則
  parse-on-start: true
  enable: true

二、基礎(chǔ)用法

2.1 引入依賴(lài)

在 Spring Boot 項(xiàng)目中,可以通過(guò)以下方式引入 LiteFlow 依賴(lài):

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

2.2 定義組件

通過(guò) @LiteflowComponent 注解定義組件,并實(shí)現(xiàn)具體的業(yè)務(wù)邏輯

@LiteflowComponent("sendEmail")
public class SendEmailComponent extends NodeComponent {
    @Override
    public void process() throws Exception {
        System.out.println("發(fā)送郵件");
    }
}

2.3 編寫(xiě)規(guī)則文件

flow.xml 文件中定義規(guī)則,也可以在代碼中自定義實(shí)現(xiàn)EL規(guī)則

xml定義方式

<flow>
    <chain name="test_flow">
        THEN(prepareTrade, grantScore, sendMq, WHEN(sendEmail, sendPhone));
    </chain>
</flow>

代碼中定義方式

import com.yomahub.liteflow.core.NodeComponent;
import com.yomahub.liteflow.el.ELBus;
import com.yomahub.liteflow.el.ThenELWrapper;
import com.yomahub.liteflow.flow.LiteflowResponse;
import com.yomahub.liteflow.slot.DefaultContext;
import com.yomahub.liteflow.spring.SpringFlowExecutor;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class LiteFlowDemo {
    @Autowired
    private SpringFlowExecutor flowExecutor;
    public void buildAndExecuteFlow() {
        // 假設(shè)有一個(gè)配置列表,每個(gè)配置項(xiàng)對(duì)應(yīng)一個(gè)處理器
        List<Map<String, Object>> configList = new ArrayList<>();
        configList.add(Map.of("name", "processor1"));
        configList.add(Map.of("name", "processor2"));
        // 假設(shè)有一個(gè)處理器名稱(chēng)映射表
        Map<String, String> processorNameMap = Map.of(
                "processor1", "component1",
                "processor2", "component2"
        );
        // 構(gòu)建 EL 表達(dá)式
        ThenELWrapper finalEL = ELBus.then();
        for (int i = 0; i < configList.size(); i++) {
            Map<String, Object> config = configList.get(i);
            String name = (String) config.get("name");
            if (!processorNameMap.containsKey(name)) {
                System.out.println("No component exists for name: " + name);
                continue;
            }
            String processor = processorNameMap.get(name);
            finalEL.then(ELBus.node(processor).data("param" + i, "data" + i));
        }
        // 執(zhí)行流程
        LiteflowResponse response = flowExecutor.execute2Resp("mainFlow", new DefaultContext());
        if (response.isSuccess()) {
            System.out.println("Flow executed successfully");
        } else {
            System.out.println("Flow execution failed");
        }
    }
}

2.4 執(zhí)行流程

通過(guò) FlowExecutor 執(zhí)行流程:

LiteflowResponse response = flowExecutor.execute2Resp("test_flow", new DataRequest());

三、適用場(chǎng)景

LiteFlow 適用于擁有復(fù)雜邏輯的業(yè)務(wù)場(chǎng)景,例如:

  • 電商下單流程:包括訂單創(chuàng)建、庫(kù)存扣減、支付處理、通知發(fā)送等多個(gè)步驟。
  • 價(jià)格計(jì)算引擎:根據(jù)不同的規(guī)則和條件計(jì)算商品價(jià)格。
  • 數(shù)據(jù)處理流程:在數(shù)據(jù)處理中,需要按順序執(zhí)行多個(gè)步驟。

四、與 Java 設(shè)計(jì)模式的相似性

4.1 策略模式

LiteFlow 的組件類(lèi)似于策略模式中的策略類(lèi),可以根據(jù)不同的規(guī)則動(dòng)態(tài)選擇執(zhí)行的組件。

4.2 模板方法模式

LiteFlow 的流程定義類(lèi)似于模板方法模式中的模板方法,定義了業(yè)務(wù)流程的骨架,而具體的組件實(shí)現(xiàn)則類(lèi)似于模板方法中的具體步驟。

4.3 責(zé)任鏈模式

LiteFlow 的組件可以通過(guò)規(guī)則進(jìn)行串聯(lián),類(lèi)似于責(zé)任鏈模式中的責(zé)任鏈,每個(gè)組件負(fù)責(zé)處理一部分邏輯。

五、實(shí)戰(zhàn)使用

5.1 電商訂單處理案例

假設(shè)在一個(gè)電商系統(tǒng)中,訂單完成后需要進(jìn)行積分發(fā)放、消息發(fā)送,并行發(fā)送短信和郵件。可以通過(guò)以下方式實(shí)現(xiàn):

xml

<flow>
    <chain name="orderCompleteFlow">
        THEN(prepareTrade, grantScore, sendMq, WHEN(sendEmail, sendPhone));
    </chain>
</flow>

5.2 動(dòng)態(tài)規(guī)則更新

LiteFlow 支持熱加載規(guī)則文件,可以在不重啟應(yīng)用的情況下更新規(guī)則。例如,將規(guī)則文件存儲(chǔ)在數(shù)據(jù)庫(kù)或配置中心(如 Nacos),修改規(guī)則后可以實(shí)時(shí)生效。

5.3 監(jiān)控與日志

LiteFlow 提供了詳細(xì)的執(zhí)行日志和監(jiān)控功能,可以記錄每個(gè)組件的執(zhí)行時(shí)間、執(zhí)行結(jié)果等信息,方便排查問(wèn)題。

5.4 高級(jí)特性

  • 組件降級(jí):在某些組件執(zhí)行失敗時(shí),可以選擇降級(jí)處理。
  • 組件繼承:可以通過(guò)繼承的方式復(fù)用組件邏輯。
  • 組件回滾:在流程執(zhí)行失敗時(shí),可以選擇回滾到之前的步驟。

六、總結(jié)

LiteFlow 是一個(gè)功能強(qiáng)大且靈活的規(guī)則引擎框架,適用于復(fù)雜的業(yè)務(wù)流程編排。通過(guò)組件化的方式,可以將復(fù)雜的業(yè)務(wù)邏輯拆分為獨(dú)立的組件,通過(guò)規(guī)則進(jìn)行編排,實(shí)現(xiàn)系統(tǒng)的高度靈活性和擴(kuò)展性。同時(shí),LiteFlow 提供了豐富的功能,如熱加載、監(jiān)控、日志等,方便開(kāi)發(fā)者使用。

擴(kuò)展問(wèn)題自測(cè)

1. LiteFlow 的核心概念是什么?它是如何實(shí)現(xiàn)規(guī)則編排的?

LiteFlow 是將復(fù)雜邏輯抽解為一個(gè)個(gè)可復(fù)用的組件化,通過(guò)組件間的自由搭配實(shí)現(xiàn)靈活編排。以及利用Apollo或Nacos這些注冊(cè)中心進(jìn)行實(shí)時(shí)熱更新

組件間的自由搭配是通過(guò)規(guī)則鏈實(shí)現(xiàn)的

{
    "chainId": "recommendChain",
    "name": "推薦鏈路",
    "condition": "A > B > C "
}

總結(jié):通過(guò) 組件化 + 規(guī)則鏈 實(shí)現(xiàn)編排,通過(guò)注冊(cè)中心監(jiān)聽(tīng)配置變更實(shí)現(xiàn)熱更新

2. LiteFlow 規(guī)則節(jié)點(diǎn)(Component)的執(zhí)行機(jī)制是怎樣的?支持哪些執(zhí)行模式?

執(zhí)行機(jī)制

  • 初始化組件,通過(guò)@LiteflowComponent 組件進(jìn)行組件注冊(cè)
  • 解析規(guī)則鏈:解析規(guī)則鏈中組件執(zhí)行鏈路
  • 執(zhí)行規(guī)則鏈

執(zhí)行模式

  • 順序模式:"condition": "A > B > C" ABC順序執(zhí)行
  • 并行執(zhí)行:"condition": "A && B && C" 我們的業(yè)務(wù)中,對(duì)商品的多路召回就是并行的
  • 選擇執(zhí)行 "condition": "A | B | C" 只執(zhí)行多個(gè)流程中最先完成的組件
  • 條件執(zhí)行 "condition": "A WHEN(B > C)"A 先執(zhí)行,然后判斷是否執(zhí)行 B > C 這條鏈路。

適用于 根據(jù)外部參數(shù)動(dòng)態(tài)決定執(zhí)行路徑。

  • FOR 循環(huán) "condition": "FOR(A, 3)" 適用于 重復(fù)性任務(wù),如輪詢(xún)、批量處理等
  • WHILE 循環(huán) "condition": "WHILE(A, isContinue())" 適用于 動(dòng)態(tài)決策的業(yè)務(wù)場(chǎng)景,如輪詢(xún)、流式處理
  • 失敗處理 "condition": "A THEN(B) A 失敗后,會(huì)執(zhí)行 B 作為補(bǔ)償措施。適用于 容錯(cuò)、降級(jí)、回滾等場(chǎng)景

3. LiteFlow 的規(guī)則是如何定義和加載的?

三種方式進(jìn)行規(guī)則定義與加載

  • json格式,在配置文件進(jìn)行配置
  • xml格式,同上
  • java代碼中動(dòng)態(tài)注冊(cè)規(guī)則鏈(推薦系統(tǒng)目前使用方式)

4. LiteFlow 規(guī)則流轉(zhuǎn)時(shí),如何保證數(shù)據(jù)在多個(gè)節(jié)點(diǎn)之間的傳遞?

LiteFlow實(shí)際上也是參考了責(zé)任鏈模式,通過(guò)一個(gè)全局變量作為上下文進(jìn)行數(shù)據(jù)流轉(zhuǎn)。LiteFlow里這個(gè)上下文變量叫做Slot(上下文容器)

LiteFlow 的 Slot 是一個(gè) 線程隔離的上下文容器,用于存儲(chǔ)和管理整個(gè)流程中的數(shù)據(jù),類(lèi)似于 ThreadLocal,但更適用于 流程級(jí)別的數(shù)據(jù)共享

每次執(zhí)行規(guī)則鏈時(shí),LiteFlow 都會(huì)為當(dāng)前執(zhí)行實(shí)例創(chuàng)建一個(gè) 獨(dú)立的 Slot,不同的請(qǐng)求不會(huì)相互影響。

LiteFlow 通過(guò) ThreadLocal + 對(duì)象池 機(jī)制來(lái)管理 Slot,確保:

  • 每個(gè)請(qǐng)求擁有獨(dú)立的 Slot 實(shí)例,數(shù)據(jù)不會(huì)互相污染。
  • Slot 復(fù)用機(jī)制 提高性能,避免頻繁創(chuàng)建對(duì)象。

總結(jié)

LiteFlow 通過(guò) Slot(數(shù)據(jù)槽)在多個(gè)節(jié)點(diǎn)之間傳遞數(shù)據(jù),相當(dāng)于流程級(jí)別的全局上下文。

Slot 的作用類(lèi)似責(zé)任鏈模式中的 Context,存儲(chǔ)數(shù)據(jù)供整個(gè)規(guī)則鏈?zhǔn)褂谩?/p>

每個(gè)請(qǐng)求擁有獨(dú)立的 Slot,避免線程安全問(wèn)題,同時(shí)通過(guò)對(duì)象池優(yōu)化性能。

5. LiteFlow 支持哪些異步執(zhí)行模式?如何處理異步任務(wù)之間的依賴(lài)?

到此這篇關(guān)于SpringBoot集成LiteFlow實(shí)現(xiàn)輕量級(jí)工作流引擎的文章就介紹到這了,更多相關(guān)SpringBoot集成LiteFlow工作流引擎內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatisplus更新某個(gè)字段為null問(wèn)題

    Mybatisplus更新某個(gè)字段為null問(wèn)題

    Mybatisplus更新某個(gè)字段為null時(shí),可以使用@TableField(updateStrategy=FieldStrategy.IGNORED)注解,該注解提供了字段映射、忽略非表字段、自動(dòng)填充策略、字段條件處理等功能
    2025-02-02
  • Java中基于物理屬性和內(nèi)容校驗(yàn)比較兩個(gè)文件是否一致

    Java中基于物理屬性和內(nèi)容校驗(yàn)比較兩個(gè)文件是否一致

    這篇文章主要介紹了Java中基于物理屬性和內(nèi)容校驗(yàn)比較兩個(gè)文件是否一致,當(dāng)一個(gè)文件經(jīng)過(guò)哈希函數(shù)處理后,會(huì)得到一個(gè)唯一代表其內(nèi)容的哈希值,如果這個(gè)文件被篡改,哈希值也會(huì)發(fā)生改變,通過(guò)比較文件的哈希值,可以輕松地驗(yàn)證文件的完整性和一致性,需要的朋友可以參考下
    2025-10-10
  • Java并發(fā)線程之線程池的知識(shí)總結(jié)

    Java并發(fā)線程之線程池的知識(shí)總結(jié)

    這篇文章主要介紹了Java并發(fā)線程之線程池的知識(shí)總結(jié),幫助大家更好的理解和學(xué)習(xí)Java并發(fā)線程的相關(guān)內(nèi)容,感興趣的朋友可以了解下
    2021-01-01
  • Java最長(zhǎng)公共子序列示例源碼

    Java最長(zhǎng)公共子序列示例源碼

    這篇文章主要介紹了Java最長(zhǎng)公共子序列的定義及示例源代碼,具有一定參考價(jià)值,需要的朋友可以看下。
    2017-09-09
  • Java實(shí)現(xiàn)限流的6種方案詳解

    Java實(shí)現(xiàn)限流的6種方案詳解

    在 Java 生態(tài)中,除了 Guava 的 RateLimiter,還有多種限流方案可供選擇,本文為大家整理了6個(gè)常用的方案,有需要的小伙伴可以根據(jù)需求進(jìn)行選擇
    2025-06-06
  • Springboot使用influxDB時(shí)序數(shù)據(jù)庫(kù)的實(shí)現(xiàn)

    Springboot使用influxDB時(shí)序數(shù)據(jù)庫(kù)的實(shí)現(xiàn)

    項(xiàng)目中需要存放大量設(shè)備日志,且需要對(duì)其進(jìn)行簡(jiǎn)單的數(shù)據(jù)分析,信息提取工作,所以本文就介紹一下Springboot使用influxDB時(shí)序數(shù)據(jù)庫(kù),感興趣的可以了解一下
    2021-08-08
  • springBoot加入thymeleaf模板的方式

    springBoot加入thymeleaf模板的方式

    這篇文章主要介紹了springBoot加入thymeleaf模板的方式,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java超詳細(xì)教你寫(xiě)一個(gè)學(xué)籍管理系統(tǒng)案例

    Java超詳細(xì)教你寫(xiě)一個(gè)學(xué)籍管理系統(tǒng)案例

    這篇文章主要介紹了怎么用Java來(lái)寫(xiě)一個(gè)學(xué)籍管理系統(tǒng),學(xué)籍管理主要涉及到學(xué)生信息的增刪查改,本篇將詳細(xì)的實(shí)現(xiàn),感興趣的朋友跟隨文章往下看看吧
    2022-03-03
  • SpringBoot開(kāi)發(fā)詳解之Controller接收參數(shù)及參數(shù)校驗(yàn)

    SpringBoot開(kāi)發(fā)詳解之Controller接收參數(shù)及參數(shù)校驗(yàn)

    數(shù)據(jù)校驗(yàn)是為了使系統(tǒng)更完整,數(shù)據(jù)更精確,同時(shí)也有利于維護(hù)數(shù)據(jù)的安全性,下面這篇文章主要給大家介紹了關(guān)于SpringBoot開(kāi)發(fā)詳解之Controller接收參數(shù)及參數(shù)校驗(yàn)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • java實(shí)現(xiàn)文件下載的兩種方式

    java實(shí)現(xiàn)文件下載的兩種方式

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件下載的兩種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論

建始县| 姜堰市| 万安县| 南川市| 黑水县| 志丹县| 竹北市| 洛扎县| 阿瓦提县| 怀远县| 四子王旗| 乐山市| 礼泉县| 饶阳县| 康平县| 驻马店市| 鲁甸县| 雷州市| 灵宝市| 宽城| 始兴县| 惠水县| 武宣县| 独山县| 应城市| 化德县| 靖西县| 烟台市| 刚察县| 顺义区| 济阳县| 墨玉县| 祁门县| 自贡市| 无锡市| 兴宁市| 都江堰市| 岳普湖县| 永丰县| 遂川县| 岱山县|