规则引擎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.mzph.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…