当前位置:首页 > 科技  > 软件

强烈推荐强大的规则引擎框架LiteFlow

来源: 责编: 时间:2024-02-29 14:43:50 293观看
导读环境:SpringBoot2.7.161. 简介LiteFlow是一个非常强大的现代化的规则引擎框架,融合了编排特性和规则引擎的所有特性。在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这

环境:SpringBoot2.7.16E1b28资讯网——每日最新资讯28at.com


1. 简介

LiteFlow是一个非常强大的现代化的规则引擎框架,融合了编排特性和规则引擎的所有特性。E1b28资讯网——每日最新资讯28at.com

在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取,内部其他系统RPC调用等等。时间一长,项目几经易手,维护成本就会越来越高。各种硬代码判断,分支条件越来越多。代码的抽象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其他模块,需要进行完整回归测试来验证。如要灵活改变业务流程的顺序,则要进行代码大改动进行抽象,重新写方法。实时热变更业务流程,几乎很难实现。LiteFlow为解耦逻辑而生,为编排而生,在使用LiteFlow之后,你会发现打造一个低耦合,灵活的系统会变得易如反掌!E1b28资讯网——每日最新资讯28at.com

LiteFlow优势

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

图片图片E1b28资讯网——每日最新资讯28at.com

组件可实时热更替,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。E1b28资讯网——每日最新资讯28at.com

图片图片E1b28资讯网——每日最新资讯28at.com

LiteFlow的脚本组件,支持众多脚本语言,完全和Java打通,你可以用脚本来实现任何逻辑。E1b28资讯网——每日最新资讯28at.com

图片图片E1b28资讯网——每日最新资讯28at.com

LiteFlow支持把编排规则和脚本放在数据库,注册中心中,还有可以任意扩展的接口,方便你定制。E1b28资讯网——每日最新资讯28at.com

图片图片E1b28资讯网——每日最新资讯28at.com

LiteFlow支持你能够想象处理的任何逻辑流程,如下流程:E1b28资讯网——每日最新资讯28at.com

图片图片E1b28资讯网——每日最新资讯28at.com

图片图片E1b28资讯网——每日最新资讯28at.com

规则文件

LiteFlow支持3中格式的规则文件定义:XML,JSON,YML。以下是XML示例:E1b28资讯网——每日最新资讯28at.com

<?xml versinotallow="1.0" encoding="UTF-8"?><flow>    <chain name="example_01">        THEN(a, b, c)    </chain></flow>

规则说明

THNE:串行执行,a执行===》执行b===》执行cE1b28资讯网——每日最新资讯28at.com

WHEN:并行执行E1b28资讯网——每日最新资讯28at.com

<chain name="chain1">    WHEN(a, b, c);</chain>

SWITCH:选择执行E1b28资讯网——每日最新资讯28at.com

<chain name="chain1">    SWITCH(a).to(b, c, d);</chain>

图片图片E1b28资讯网——每日最新资讯28at.com

IF:条件执行E1b28资讯网——每日最新资讯28at.com

IF二元E1b28资讯网——每日最新资讯28at.com

<chain name="chain1">    THEN(        IF(x, a),        b    );</chain>

图片图片E1b28资讯网——每日最新资讯28at.com

其中x为条件节点,为真的情况下,执行链路就为x->a->b,为假链路就为x->b。E1b28资讯网——每日最新资讯28at.com

IF三元E1b28资讯网——每日最新资讯28at.com

<chain name="chain1">    THEN(        IF(x, a, b),        c    );</chain>

图片图片E1b28资讯网——每日最新资讯28at.com

还有其它很多的规则,这里不一一举例,可以查看官网。E1b28资讯网——每日最新资讯28at.com

2. 实战案例

环境配置E1b28资讯网——每日最新资讯28at.com

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

配置文件E1b28资讯网——每日最新资讯28at.com

#liteflow 配置liteflow:  rule-source: flows/*.el.xml


E1b28资讯网——每日最新资讯28at.com

整个规则流程执行如下E1b28资讯网——每日最新资讯28at.com

图片图片E1b28资讯网——每日最新资讯28at.com


E1b28资讯网——每日最新资讯28at.com

规则定义E1b28资讯网——每日最新资讯28at.com

<?xml versinotallow="1.0" encoding="UTF-8"?><flow>    <chain name="processOrder">        THEN(          initOrder,           IF(amount, discountOrder),          SWITCH(userType).to(vipDiscountOrder, normalDiscountOrder),          completeOrder        )    </chain></flow>

这里的initOrder,amount,discountOrder等都是具体Node接口是bean的名称。E1b28资讯网——每日最新资讯28at.com

初始化订单组件

@Component("initOrder")public class InitOrderComponent extends NodeComponent {  @Override  public void process() {    System.out.println("初始化订单...") ;    Order order = this.getContextBean(Order.class) ;    double sum = order.getItems().stream().mapToDouble(item -> {      return item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())).doubleValue() ;    }).sum() ;    order.setTotalAmount(BigDecimal.valueOf(sum));  }}

这里只做了计算订单总额。E1b28资讯网——每日最新资讯28at.com

判断订单总额节点
E1b28资讯网——每日最新资讯28at.com

@Component("amount")public class AmountComponent extends NodeIfComponent {  @Override  public boolean processIf() throws Exception {    System.out.println("判断总金额,超过100元打折") ;    Order order = this.getContextBean(Order.class) ;    return order.getTotalAmount().doubleValue() >= 100D ;  }}

用户类型判断,执行哪个节点E1b28资讯网——每日最新资讯28at.com

@Component("userType")public class UserTypeComponent extends NodeSwitchComponent {  @Override  public String processSwitch() throws Exception {    User user = this.getContextBean(User.class) ;    if (user.isVip()) {      return "vipDiscountOrder" ;    }    return "normalDiscountOrder" ;  }}

上面返回的是具体节点的beanName。E1b28资讯网——每日最新资讯28at.com

VIP折扣节点
E1b28资讯网——每日最新资讯28at.com

@Component("vipDiscountOrder")public class VIPDiscountOrderComponent extends NodeComponent {  @Override  public void process() {    System.out.println("VIP会员打9折") ;    Order order = this.getContextBean(Order.class) ;    order.setTotalAmount(order.getTotalAmount().multiply(BigDecimal.valueOf(9)).divide(BigDecimal.valueOf(10), RoundingMode.HALF_UP)) ;  }}

普通会员折扣节点E1b28资讯网——每日最新资讯28at.com

@Component("normalDiscountOrder")public class NormalDiscountOrderComponent extends NodeComponent {  @Override  public void process() {    System.out.println("普通会员不打折") ;  }}

完成节点E1b28资讯网——每日最新资讯28at.com

@Component("completeOrder")public class CompleteOrderComponent extends NodeComponent  {  @Override  public void process() throws Exception {    System.out.println("订单折扣执行完成,最后收尾...") ;  }}

以上是该规则流程的所有配置及定义。接下来进行测试E1b28资讯网——每日最新资讯28at.com

// 直接注入该类进行规则流程的启动执行@Resourceprivate FlowExecutor flowExecutor;@Testpublic void testExample02() {  Order order = new Order() ;  order.setId(1L) ;  order.setSno("S001") ;  List<OrderItem> items = new ArrayList<>() ;  items.add(new OrderItem(1L, 2, BigDecimal.valueOf(22))) ;  items.add(new OrderItem(2L, 1, BigDecimal.valueOf(24.5))) ;  items.add(new OrderItem(3L, 5, BigDecimal.valueOf(66.3))) ;  order.setItems(items) ;  User user = new User() ;  user.setId(1L) ;  user.setVip(false) ;  LiteflowResponse response = flowExecutor.execute2Resp("processOrder", null, order, user);  if (!response.isSuccess()) {    Exception e = response.getCause() ;    e.printStackTrace() ;  } else {    System.out.println("流程成功执行...") ;    System.out.println("最终应付款:" + response.getContextBean(Order.class).getTotalAmount().doubleValue()) ;  }}

控制台将会输出详细的信息。E1b28资讯网——每日最新资讯28at.com

图片图片E1b28资讯网——每日最新资讯28at.com

修改用户类型后执行E1b28资讯网——每日最新资讯28at.com

图片图片E1b28资讯网——每日最新资讯28at.com

以上是本篇文章的全部内容,希望对你有所帮助。E1b28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-75360-0.html强烈推荐强大的规则引擎框架LiteFlow

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Vue3问题:如何实现拼图验证+邮箱登录功能?前后端!

下一篇: 掌握 Python 栈,轻松实现进制转换

标签:
  • 热门焦点
  • iPhone卖不动了!苹果股价创年内最大日跌幅:市值一夜蒸发万亿元

    8月5日消息,今天凌晨美股三大指数高开低走集体收跌,道指跌0.41%;纳指跌0.36%;标普500指数跌0.52%。热门科技股也都变化极大,其中苹果报181.99美元,跌4.8%,创
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
Top