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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/685476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis-Cluster模式基操篇

一、场景 1、搞一套6个主节点的Cluster集群 2、模拟数据正常读写 3、模拟单点故障 4、在不停服务的情况下将集群架构改为3主3从 二、环境规划 6台独立的服务器&#xff0c;端口18001~18006 192.169.14.121 192.169.14.122 192.169.14.123 192.169.14.124 192.169.14.125 192…

XR模拟的巨大飞跃,Varjo如何塑造战斗机飞行员培训的未来

随着虚拟现实技术的不断发展&#xff0c;拥有直通功能的XR技术被广泛应用于各种虚拟培训项目之中&#xff0c;能够完美混合虚拟与现实环境的XR技术能够最大限度的优化培训效果并有效减少仿真培训中的成本消耗。 技术总部位于加利福尼亚州南旧金山的Aechelon是集培训、模拟和娱乐…

【简单讲解下TalkingData】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

PPT视频如何16倍速或者加速播放

有两种方式&#xff0c;一种是修改PPT本身&#xff0c;这种方式非常繁琐&#xff0c;不太推荐&#xff0c;还有一种就是修改视频本身&#xff0c;直接让视频是16倍速的视频即可。 如何让视频16倍速&#xff0c;我建议人生苦短&#xff0c;我用Python&#xff0c;几行代码&…

docker-compose部署 kafka 3.7 集群(3台服务器)并启用账号密码认证

文章目录 1. 规划2. 服务部署2.1 kafka-012.2 kafka-022.3 kafka-032.4 启动服务 3. 测试3.1 kafkamap搭建&#xff08;测试工具&#xff09;3.2 测试 1. 规划 服务IPkafka-0110.10.xxx.199kafka-0210.10.xxx.198kafka-0310.10.xxx.197kafkamp10.10.xxx.199 2. 服务部署 2.1…

Mysql学习(三)——SQL通用语法之DML

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 DML添加数据修改数据删除数据 总结 DML DML用来对数据库中表的数据记录进行增删改操作。 添加数据 -- 给指定字段添加数据 insert into 表名(字段1&#xff0c;字…

逻辑回归及python实现

概述 logistic回归是一种广义线性回归&#xff08;generalized linear model&#xff09;&#xff0c;因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同&#xff0c;都具有 w‘xb&#xff0c;其中w和b是待求参数&#xff0c;其区别在于他们的因变量不同&#x…

Java Web学习笔记15——DOM对象

DOM&#xff1a; 概念&#xff1a;Document Object Model&#xff1a; 文档对象模型 将标记语言的各个组成部分封装为对应的对象&#xff1a; Document: 整个文档对象 Element&#xff1a;元素对象 Attribute&#xff1a; 属性对象 Text&#xff1a;文本对象 Comment&a…

STM32-16-ADC

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD STM32-15-DMA…

麒麟操作系统rpm ivh安装rpm包卡死问题分析

夜间变更开发反应,rpm -ivh 安装包命令夯死,无执行结果,也无报错 排查 : 1、top 查看无进程占用较高进程存在,整体运行平稳 2、df -h 查看磁盘并未占满 3、其他服务器复现该命令正常执行 4、ps -ef|grep rpm 查看安装命令仍在运行中 5、查看log日志,均正常并无不良日志…

【自然语言处理】【Scaling Law】语言模型物理学 第3.3部分:知识容量Scaling Laws

语言模型物理学3.3&#xff1a;知识容量Scaling Laws 论文名称&#xff1a;Physics of Language Models: Part 3.3, Knowledge Capacity Scaling Laws 论文地址&#xff1a;https://arxiv.org/pdf/2404.05405 相关博客 【自然语言处理】【Scaling Law】Observational Scaling …

表格中附件的上传、显示以及文件下载#Vue3#后端接口数据

表格中附件的上传及显示#Vue3#后端接口数据 一、图片上传并显示在表格中实现效果&#xff1a; 表格中上传附件 代码&#xff1a; <!-- 文件的上传及显示 --> <template><!-- 演示地址 --><div class"dem-add"><!-- Search start -->…

生信学习入门常见错误可能的原因分类总结和求助指南

文件或目录找不到 这是常见问题&#xff0c;常见提示有 No such file or directory Error in file(file, “rt”)&#xff1a;无法打开链接 Fatal error: Unable to open file for reading (seq/WT1_1.fq) Fatal error: Unable to read from file (C:Program file/Git/usea…

I2C通信外设

I2C外设介绍 主机&#xff0c;就是拥有主动控制总线的权利。从机&#xff0c;只能在从机允许的情况下&#xff0c;才能控制总线。 多主机模型可分为固定多主机和可变多主机。固定多主机就是总线上&#xff0c;有2个或2个以上固定的主机&#xff0c;上面固定为主机&#xff0c;下…

【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 vim编辑器 Linux编译器&#xff1a;gcc/g使用 gcc和g的选项 编译过程 动静态库的链接 Linux项目的自动化构建 生成可执行程序 清理可执行程序 Linux调试器-gdb使用 git和git…

PHP函数大全之array_count_values()

array_count_values()函数是用于计算数组中每个值的出现次数的PHP函数&#xff0c;并返回一个关联数组&#xff0c;该数组的键表示原始数组中的唯一值&#xff0c;而键值表示该值在原始数组中的出现次数。 array_count_values()函数的一些注意事项&#xff1a; 该函数不区分大…

Python第二语言(四、Python数据容器)

目录 一、 数据容器&#xff08;list、tuple、str、map、dict&#xff09; 1. 数据容器概念 2. 列表list&#xff08; [] &#xff09; 2.1 定义方式 2.2 嵌套列表 2.3 list通过获取下标索引获取值 2.4 下标使用概念 2.5 list列表的使用&#xff08;列表的方法&#xff…

【ARM Cache 及 MMU 系列文章 6.2 -- ARMv8/v9 Cache 内部数据读取方法详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Direct access to internal memoryL1 cache encodingsL1 Cache Data 寄存器Cache 数据读取代码实现Direct access to internal memory 在ARMv8架构中,缓存(Cache)是用来加速数据访…

德国西门子论未来质量管理 - 如何与明天相遇?

未来制造业的质量 -- 如何用软件方案满足质量要求 作者&#xff1a;Bill Butcher 翻译&编辑&#xff1a;数字化营销工兵 【前言】在Frost&Sullivan最近发表的一份白皮书中&#xff0c;他们讨论了制造业的质量投资。质量是制造过程的关键要素&#xff0c;但似乎比其他…

顶顶通呼叫中心中间件-同振和顺振配置步骤(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-同振和顺振配置步骤(mod_cti基于FreeSWITCH) 一、拨号方案配置 1、同振 win-ccadmin配置方法 1、点击拨号方案->2、在红框中输入同振->3、点击添加->4、根据图中配置&#xff0c;配置好了等待一分钟即可生效。 web-ccadmin配置方法 2、顺振…