liteflow学习二

简介: liteflow学习二

前面我们看到了执行的具体逻辑,但是在哪里构建EL表达式的、获取的、执行的呢?

一、EL表达式的设置

在LiteFlowChainELBuilder可以看到EL表达式的逻辑是基于阿里开源的QLExpress实现的, 在初始化QLExpress的Runner中,作者扩展了很多操作Operator。在setEL(String elStr)这个方法中,我们可以会将FlowBus中的chainMap和NodeMap放入到Context中,也即DefaultContext,同时放入当前的chainId。接着会解析el表达式,解析成最外部一个condition, 内部可以嵌套很多层。

可以看到构建EL表达式的过程中会涉及到chainMap和NodeMap放入到DefaultContext中:

DefaultContext<String, Object> context = new DefaultContext<>();
// 这里一定要先放chain,再放node,因为node优先于chain,所以当重名时,node会覆盖掉chain
FlowBus.getChainMap().values().forEach(chain -> context.put(chain.getChainId(), chain));
// 往上下文里放入所有的node,使得el表达式可以直接引用到nodeId
FlowBus.getNodeMap().keySet().forEach(nodeId -> context.put(nodeId, FlowBus.getNode(nodeId)));
// 放入当前主chain的ID
context.put(ChainConstant.CURR_CHAIN_ID, this.chain.getChainId());
// 解析el成为一个Condition
// 为什么这里只是一个Condition,而不是一个List<Condition>呢
// 这里无论多复杂的,外面必定有一个最外层的Condition,所以这里只有一个,内部可以嵌套很多层,这点和以前的不太一样
Condition condition = (Condition) EXPRESS_RUNNER.execute(elStr, context, errorList, true, true);
// 把主要的condition加入
this.conditionList.add(condition);

可以看到我们的WHEN表达式会进行WHEN的EL表达式的解析,此时经过BaseOperator会对对应的Operator进行依次构建。所有的Operator都会经过com.yomahub.liteflow.builder.el.operator.base.BaseOperator#executeInner进行build。

因此我们来看看WhenOperator是如何构建的。

public WhenCondition build(Object[] objects) throws Exception {
        OperatorHelper.checkObjectSizeGtZero(objects);
        WhenCondition whenCondition = new WhenCondition();
        for (Object obj : objects) {
            whenCondition.addExecutable(OperatorHelper.convert(obj, Executable.class));
        }
        return whenCondition;
    }

此时会将可执行的执行器放入到executableGroup中,方便执行condition的时候获取执行。

public void addExecutable(String groupKey, Executable executable) {
        System.out.println("添加执行的operator");
        if (ObjectUtil.isNull(executable)) {
            return;
        }
        List<Executable> executableList = this.executableGroup.get(groupKey);
        if (CollUtil.isEmpty(executableList)) {
            this.executableGroup.put(groupKey, ListUtil.toList(executable));
        }
        else {
            this.executableGroup.get(groupKey).add(executable);
        }
    }

前面我们已经知道,liteflow的执行逻辑是先获取chain,然后执行chain,然后执行condition,最终执行业务逻辑中的nodeComponent。因此我们来看看并行器是如何实现的。

二、并行器是如何实现

前面说到THEN打头的是串行器,而WHEN打头的是并行器,因此我们可以看到Condition中的并行器对应的WhenCondition。

可以看到执行的execution是executeAsyncCondition(slotIndex)。

前面看到初始化LiteflowConfig的时候,没有配置信息。可以看到线程池的配置信息就是配置在LiteflowConfig中的。并行编排的实现借助了封装CompletableFuture对象。

前面我们知道执行condition的方法是executeCondition(Integer slotIndex)。执行condition的核心方法是com.yomahub.liteflow.flow.element.condition.WhenCondition#executeAsyncCondition。

那么此时我们似乎在Future的代码中找不到调用的逻辑,如果看过我上一篇文章的话,那应该知道调用condition之后,会调用具体的node执行业务逻辑编排代码。因此此时我们可以根据之前的线索知道会调用node中的execute方法。因此我们可以查询引用的地方,从而找到对应的地方。

根据前的ThenCondition的调用,我们知道调用的过程是condition到node的过程,因此这个过程必然会涉及到node的调用过程。因此我们可以知道对应的node的执行是在ParallelSupplier中。

public WhenFutureObj get() {
        try {
            executableItem.setCurrChainId(currChainId);
            executableItem.execute(slotIndex);
            return WhenFutureObj.success(executableItem.getId());
        }
        catch (Exception e) {
            return WhenFutureObj.fail(executableItem.getId(), e);
        }
    }

从而调用node执行具体的业务逻辑方法com.yomahub.liteflow.flow.element.Node#execute。

从而进一步调用我们自己写的业务逻辑。

总结下来即:组装数据chain、node ,构建EL表达式,然后根据通过槽拿到chain,从而进一步拿到condition,从而拿到node,调用业务系统继承NodeComponent重写的process方法。


三、UML图

这里我们了解了并行编排的相关执行流程后,当然这些都是基于正常情况下实现的编排。如果是异常情况下,或者说重试失败的情况下,又做怎样的处理呢?下一篇,我们来学习,因为在业务处理中,我们会用到,同时这也是框架留给我们继承重写的方法。因此需要了解。


参考:https://gitee.com/dromara/LiteFlow  LiteFlow的官网地址:https://liteflow.cc/

目录
相关文章
|
人工智能 JSON Java
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
AI时代下,规则引擎的需求反而更旺盛。QLExpress4 通过全面重构,在性能、可观测性和AI友好性上大幅提升。
2803 15
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
|
10月前
|
弹性计算 安全 关系型数据库
阿里云产品组合购买套餐解析:特惠方案、组合配置与套餐价格参考
2026年阿里云继续推出多样化云产品组合特惠方案,以99元、199元云服务器为核心,适配个人开发者、中小企业等多类用户需求。99元经济型e实例(2核2G+3M带宽+40G云盘)适合简单网站、开发测试;199元u1实例(2核4G+5M带宽+80G云盘)支持企业级应用。方案包含域名+ECS+智能建站、ECS+RDS、ECS+云安全中心等组合,提供自动扩缩容、跨可用区容灾等技术保障,结合续费同价、组合优惠等政策,助力用户实现从基础建站到企业级应用的一站式上云。
827 3
|
消息中间件 JavaScript Dubbo
spring cloud alibaba springboot nacos 版本对应
spring cloud alibaba springboot nacos 版本对应
11085 0
|
数据采集 搜索推荐 JavaScript
302重定向:临时改道的艺术与陷阱何时该用,何时该避?
HTTP 302重定向是一种临时性地址变更机制,适用于短期、可逆的场景。与永久重定向301不同,302不会将旧URL的权重传递给新URL,搜索引擎会继续索引原始页面。常见用途包括A/B测试、限时促销、服务器维护和登录跳转等。使用302时需注意设定明确的时间范围,避免误用于永久变更,并定期监控重定向状态,防止SEO权重流失或用户体验混乱。正确使用302有助于在不损害SEO表现的前提下灵活应对网站变动需求。
2508 2
|
XML 测试技术 uml
liteflow学习一
liteflow学习一
1783 0
|
SQL 人工智能 数据挖掘
Quick BI V6.0发布:让人人都能拥有的「超级数据分析师」到底强在哪?
阿里巴巴发布首个数据分析Agent“智能小Q”,集成问数、解读、报告生成与报表搭建能力,基于AI实现一句话获取数据洞察。Quick BI 6.0深度融合AI与BI,升级多源数据接入、自动化分析与协同办公,让企业人人拥有“超级数据分析师”。
|
人工智能 Python
2025自学编程实操指南第一课面向AI编程
2025自学编程实操指南第一课面向AI编程,第一个实践案例:贪吃蛇游戏
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
2097 11
|
存储 数据采集 监控
从存储统一到数据融合,SLS在可观测场景的思考和行动
介绍SLS在可观测数据融合分析的一系列技术升级,融合Trace、全栈监控、Continuous Profiling、移动端监控等功能,帮助大家更快速地构筑全栈、自动化的观测能力。
129355 52
|
流计算 NoSQL Redis
基于Flink和规则引擎的实时风控解决方案
对一个互联网产品来说,典型的风控场景包括:注册风控、登陆风控、交易风控、活动风控等,而风控的最佳效果是防患于未然,所以事前事中和事后三种实现方案中,又以事前预警和事中控制最好。 这要求风控系统一定要有实时性。
14942 155