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

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

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

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


1. 简介

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

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

LiteFlow优势

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

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

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

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

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

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

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

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

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

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

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

规则文件

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

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

规则说明

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2. 实战案例

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

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

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

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


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

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

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


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

规则定义K6c28资讯网——每日最新资讯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的名称。K6c28资讯网——每日最新资讯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));  }}

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

判断订单总额节点
K6c28资讯网——每日最新资讯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 ;  }}

用户类型判断,执行哪个节点K6c28资讯网——每日最新资讯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。K6c28资讯网——每日最新资讯28at.com

VIP折扣节点
K6c28资讯网——每日最新资讯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)) ;  }}

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

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

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

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

以上是该规则流程的所有配置及定义。接下来进行测试K6c28资讯网——每日最新资讯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()) ;  }}

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
Top