Springboot集成规则引擎框架-LiteFlow


程序员的公众号:源1024获取更多资料,无加密无套路!

最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上


 以上图片来自AI:https://www.gnomic.cn/?feigpt

LiteFlow

LiteFlow是一个非常强大的现代化的规则引擎框架,融合了编排特性和规则引擎的所有特性。

使用场景

LiteFlow适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。

优势

利用LiteFlow,你可以将瀑布流式的代码,转变成以组件为核心概念的代码结构,这种结构的好处是可以任意编排,组件与组件之间是解耦的,组件可以用脚本来定义,组件之间的流转全靠规则来驱动。LiteFlow拥有开源规则引擎最为简单的DSL语法。十分钟就可上手。

组件可实时热更替,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。

LiteFlow的脚本组件,支持众多脚本语言,完全和Java打通,你可以用脚本来实现任何逻辑。

LiteFlow支持把编排规则和脚本放在数据库,注册中心中,还有可以任意扩展的接口,方便你定制。

实操

添加依赖

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

配置

application.yml


liteflow:
  #规则文件路径
  rule-source: config/flow.el.xml
  #-----------------以下非必须-----------------
  #liteflow是否开启,默认为true
  enable: true
  #liteflow的banner打印是否开启,默认为true
  print-banner: true
  #zkNode的节点,只有使用zk作为配置源的时候才起作用,默认为/lite-flow/flow
  zk-node: /lite-flow/flow
  #上下文的最大数量槽,默认值为1024
  slot-size: 1024
  #FlowExecutor的execute2Future的线程数,默认为64
  main-executor-works: 64
  #FlowExecutor的execute2Future的自定义线程池Builder,LiteFlow提供了默认的Builder
  main-executor-class: com.yomahub.liteflow.thread.LiteFlowDefaultMainExecutorBuilder
  #自定义请求ID的生成类,LiteFlow提供了默认的生成类
  request-id-generator-class: com.yomahub.liteflow.flow.id.DefaultRequestIdGenerator
  #并行节点的线程池Builder,LiteFlow提供了默认的Builder
  thread-executor-class: com.yomahub.liteflow.thread.LiteFlowDefaultWhenExecutorBuilder
  #异步线程最长的等待时间(只用于when),默认值为15000
  when-max-wait-time: 15000
  #异步线程最长的等待时间(只用于when),默认值为MILLISECONDS,毫秒
  when-max-wait-time-unit: MILLISECONDS
  #when节点全局异步线程池最大线程数,默认为16
  when-max-workers: 16
  #并行循环子项线程池最大线程数,默认为16
  parallelLoop-max-workers: 16
  #并行循环子项线程池等待队列数,默认为512
  parallelLoop-queue-limit: 512
  #并行循环子项的线程池Builder,LiteFlow提供了默认的Builder
  parallelLoop-executor-class: com.yomahub.liteflow.thread.LiteFlowDefaultParallelLoopExecutorBuilder
  #when节点全局异步线程池等待队列数,默认为512
  when-queue-limit: 512
  #是否在启动的时候就解析规则,默认为true
  parse-on-start: true
  #全局重试次数,默认为0
  retry-count: 0
  #是否支持不同类型的加载方式混用,默认为false
  support-multiple-type: false
  #全局默认节点执行器
  node-executor-class: com.yomahub.liteflow.flow.executor.DefaultNodeExecutor
  #是否打印执行中过程中的日志,默认为true
  print-execution-log: true
  #是否开启本地文件监听,默认为false
  enable-monitor-file: false
  #简易监控配置选项
  monitor:
    #监控是否开启,默认不开启
    enable-log: true
    #监控队列存储大小,默认值为200
    queue-limit: 200
    #监控一开始延迟多少执行,默认值为300000毫秒,也就是5分钟
    delay: 300000
    #监控日志打印每过多少时间执行一次,默认值为300000毫秒,也就是5分钟
    period: 300000

定义组件

普通组件
@Component("a")
public class ACmp extends NodeComponent {
    @Override
    public void process() {
        //do your business
        String params = (String)this.getRequestData();
        System.out.println("A 组件执行。。。接受参数:"+ params);
    }

}
@Component("b")
public class BCmp extends NodeComponent {
    @Override
    public void process() {
        //do your business
        String params = (String)this.getRequestData();
        System.out.println("B 组件执行。。。接受参数:"+ params);
    }
}
@Component("c")
public class CCmp extends NodeComponent {
    @Override
    public void process() {
        //do your business
        System.out.println("C 组件执行。。。");
    }
}
选择组件
@Component("switch")
public class SwitchCmp extends NodeSwitchComponent {

    @Override
    public String processSwitch() {
        //do your business
        System.out.println("switch 组件执行。。。");
        return "b";
    }
}
条件组件
@Component("e")
public class ECmp extends NodeIfComponent {
    @Override
    public boolean processIf() throws Exception {
        return true;
    }
}
次数循环组件
@Component("f")
public class FCmp extends NodeForComponent {
    @Override
    public int processFor() throws Exception {
        return 3;
    }
}
条件循环组件
@Component("while")
public class WhileCmp extends NodeWhileComponent {
    @Override
    public boolean processWhile() throws Exception {
        return true;
    }
}
迭代循环组件
@Component("h")
public class HCmp extends NodeIteratorComponent {
    @Override
    public Iterator<?> processIterator() throws Exception {
        ArrayList<String> list = ListUtil.toList("a", "b", "c");
        return list.iterator();
    }
}
退出循环组件
@Component("g")
public class GCmp extends NodeBreakComponent {
    @Override
    public boolean processBreak() throws Exception {
        System.out.println("break g组件执行中。。。");
        //为true则退出循环
        return true;
    }
}

定义规则文件

resource/config下定义flow.el.xml

<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <!--串行编排-->
    <chain name="chain1">
        THEN(a, b, c);
    </chain>
    <!--并行编排-->
    <chain name="chain2">
        WHEN(a, b, c);
    </chain>
    <!--选择编排-->
    <chain name="chain3">
        SWITCH(switch).to(b, c).DEFAULT(b);
    </chain>
    <!--条件编排-->
    <chain name="chain4">
        IF(e, a,b);
    </chain>
    <!--循环编排-->
    <chain name="chain5">
        FOR(f).DO(THEN(a, b));
    </chain>
    <chain name="chain6">
        WHILE(while).DO(THEN(a, b)).BREAK(g);
    </chain>
    <chain name="chain7">
        ITERATOR(h).DO(THEN(a, b));
    </chain>

</flow>

执行链路

@Controller
public class FlowController {

    @Resource
    private FlowExecutor flowExecutor;

    @RequestMapping("/flow")
    @ResponseBody
    public void flow() {
        LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg-1");
    }

    @RequestMapping("/flow2")
    @ResponseBody
    public void flow2() {
        LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg-2");
    }

    @RequestMapping("/flow3")
    @ResponseBody
    public void flow3() {
        LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg-3");
    }

    @RequestMapping("/flow4")
    @ResponseBody
    public void flow4() {
        LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg-4");
    }

    @RequestMapping("/flow5")
    @ResponseBody
    public void flow5() {
        LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg-5");
    }

    @RequestMapping("/flow6")
    @ResponseBody
    public void flow6() {
        LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg-6");
    }

    @RequestMapping("/flow7")
    @ResponseBody
    public void flow7() {
        LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg-7");
    }

}

启动

可以看到组件被扫描日志

执行日志

更多功能见官方文档

LiteFlow官网

gitee地址

github地址


 系列文章索引

MyBatis的插件能在哪些地方进行拦截?

了解MyBatis的缓存机制吗

面试官:谈谈对volatile的理解

Spring中用到了哪些设计模式

面试官:说一下SQL的执行过程

线程池的工作原理


 

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

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

相关文章

mysql调优-Join多种连接方式

简单嵌套循环连接 r为驱动表&#xff0c;s为匹配表&#xff0c;可以看到从r中分别取出每一个记录去匹配s表的列&#xff0c;然 后再合并数据&#xff0c;对s表进行r表的行数次访问&#xff0c;对数据库的开销比较大 索引嵌套循环连接 这个要求非驱动表&#xff08;匹配表s&…

Linux中目录的操作和文件属性获取(opendir、readdir、close函数的使用)

访问目录 opendir函数 #include <dirent.h> DIR *opendir(const char *name); DIR *fdopendir(int fd); 使用文件描述符&#xff0c;要配合open函数使用 DIR是用来描述一个打开的目录文件的结构体类型 成功时返回目录流指针&#xff1b;出错时返回NULLreaddir函数 #incl…

Adobe Media Encoder 2023下载安装教程,ME 2023安装教程,附安装包和工具,无套路,轻松搞的安装

前言 Adobe Media Encoder是一个视频和音频编码应用程序&#xff0c;可让针对不同应用程序和观众&#xff0c;以各种分发格式对音频和视频文件进行编码。包括专门设计的预设设置&#xff0c;以便导出与特定交付媒体兼容的文件&#xff0c;可以按适合多种设备的格式导出视频&am…

【医学图像数据增强】切割-拼接(CS-DA)

切割-拼接CS-DA CS-DA 核心思想自然图像和医学图像之间的关键差异CS-DA 步骤确定增强后的数据数量 代码复现 CS-DA 核心思想 论文链接&#xff1a;https://arxiv.org/ftp/arxiv/papers/2210/2210.09099.pdf 大多数用于医学分割的数据增强技术最初是在自然图像上开发的&#x…

Git 教程 | 将本地修改后的文件推送到 Github 指定远程分支上

Git 是一种分布式版本控制系统&#xff0c;用于敏捷高效地处理任何大小的项目。它是由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的开源版本控制软件。Git 的本地克隆就是一个完整的版本控制存储库&#xff0c;无论脱机还是远程都能轻松工作。开发人员会在本地提交其工…

Maven进阶

学习目标 理解分模块开发的意义 能够使用聚合工程快速构建项目 能够使用继承简化项目配置 能够根据需求配置生产、开发、测试环境&#xff0c;并在各环境间切换运行 一、分模块开发与设计 1. 分模块开发的意义 问题导入 分模块开发对工程有什么好处&#xff1f; 模块拆分原…

接口测试时遇到接口加密了该如何处理?

对明文编码生成信息摘要&#xff0c;以防止被篡改。比如MD5使用的是Hash算法&#xff0c;无论多长的输入&#xff0c;MD5都会输出长度为128bits的一个串。摘要算法不要秘钥&#xff0c;客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文。 对称加密 对称加密…

VM下Unbunt虚拟机上网设置

系列文章目录 VM下Unbunt虚拟机上网设置 VM虚拟机上网设置 系列文章目录一、VM虚拟机上网设置 一、VM虚拟机上网设置 右击VM软件中你需要设置的虚拟机&#xff0c;选择设置 宿主机如果你用的是笔记本外加WIFI连接选择NAT网络模式 进入虚拟机看能否上网 不行的话&#xff0c;进…

计算机速成课Crash Course - 23. 屏幕 2D 图形显示

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 23. 屏幕& 2D 图形显示 (qq.com) 23. 屏幕& 2D 图形显示 这台…

【Go 快速入门】安装 Go 语言 | 开发工具 Goland | 第一个 Go 语言程序

文章目录 前言安装 Go 语言编译器 Goland运行 Go 程序补充 前言 本系列教程&#xff0c;目的是帮助一个有其他编程基础的 Go 语言小白快速入门 Go 语言&#xff0c;而非启发式学习。每篇幅保证不说废话&#xff0c;尽可能精炼总结&#xff0c;为上手后续的 Go 相关项目打下基础…

目标检测数据集 - 抽烟检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;抽烟检测数据集&#xff0c;真实合成场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如街景抽烟、写字楼抽烟、办公室抽烟、楼道抽烟、遮挡行人抽烟、严重遮挡行人抽烟数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控或室内监控场…

2024年,每个人都应该知道的10个免费学习资源网站

在这个数字化的时代&#xff0c;有着许多宝贵的网络资源&#xff0c;提供了无限的学习机会&#xff0c;为每个人敞开了免费获取知识的大门。但很多人不知道它们的存在。今天分享10个免费且丰富的学习资源网站&#xff0c;希望对大家所有帮助。 1.freeCodeCamp 您可以免费学习…

<网络安全>《2 国内主要企业网络安全公司概览(二)》

4 北京天融信科技有限公司(简称天融信) 信息内容LOGO成立日期创始于1995年总部北京市海淀区上地东路1号院3号楼北侧301室背景民营企业是否上市天融信[002212]A股市值99亿主要产品网络安全大数据云服务员工规模6000多人简介天融信科技集团&#xff08;证券代码&#xff1a;0022…

支持向量机(Support Vector Machines)(需要优化)

1.优化目标 一个更加强大的算法广泛的应用于工业界和学术界&#xff0c;它被称为支持向量机(Support Vector Machine)。与逻辑回归和神经网络相比&#xff0c;支持向量机&#xff0c;或者简称 SVM&#xff0c;在学习复杂的非线性方程时提供了一种更为清晰&#xff0c;更加强大…

利用C语言实例描述程序中的内聚和耦合

编程时&#xff0c;我们讲究的是高内聚低耦合&#xff0c;在协同开发、代码移植、维护等环节都起到很重要的作用。 一、原理篇 而低耦合&#xff0c;是指模块之间尽可能的使其独立存在&#xff0c;模块之间不产生联系不可能&#xff0c;但模块与模块之间的接口应该尽量少而简单…

从零学习Hession RPC

为什么学习Hessian RPC&#xff1f; 存粹的RPC&#xff0c;只解决PRC的四个核心问题&#xff08;1.网络通信2.协议 3.序列化 4.代理&#xff09;Java写的HessianRPC落伍了&#xff0c;但是它的序列化方式还保存着&#xff0c;被Dubbo(Hessian Lite)使用。 被落伍&#xff0c;只…

浅谈DNS的工作原理及其作用

DNS&#xff0c;全称为Domain Name System&#xff0c;即域名系统&#xff0c;是一种用于将域名和IP地址相互映射的分布式数据库系统。它将可读的域名转换为对应的IP地址&#xff0c;使得用户可以更方便地通过域名来访问网络上的资源。今天锐成就简单探讨一下DNS的工作原理及其…

Android网络状态差的处理方案

1,在没有网络的情况下的处理 相信大家面对这个情况处理起来是毫无压力的. //有网 if (Utils.isNetworkConnected(this)) {loadingView.setVisibility(View.VISIBLE);//显示正在加载//联网获取数据getDataFromNet(); } else {//没网直接显示本地数据.showView();Toast.makeTex…

Ubuntu20.04 安装 ROS noetic + MAVROS

本文在 AlphaCatOvO【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程 基础上&#xff0c;根据实际安装经验&#xff0c;稍微进行补充。 一、安装Ubuntu20.04 假设已经正确安装。 二、安装 ROS noetic 2.1 换源 执行 sudo apt update sudo mv /etc/apt/sources.list /etc/apt/…

C++代码入门07 函数调用语句

图源&#xff1a;文心一言 听课笔记简单整理&#xff0c;包括以下内容”&#x1f40b;3.2 二进制转十进制、&#x1f40b;3.3 数学公式1&#xff1a;用反切函数表示pi、&#x1f40b;3.4 判断回文数、&#x1f40b;3.5 数学公式2&#xff1a;分段函数、&#x1f40b;3.6 扔骰子…