规则引擎easy-rule快速入门及整合SpEL使用

EasyRules规则引擎工具类 EasyRules是一款基于java的开源的轻量级的规则引擎框架。EasyRules框架非常易于使用,可以和其他任务java应用程序无缝集成。在本文中,我们将对其进行一盒简单的封装,以实现复杂的规则表达式匹配。 阅读详情

规则引擎介绍

规则引擎解决的实际上就是判断条件分支过多的问题,举个例子,营销策略里,消费不足200,可用10元消费券,消费超过200元,可以享受9折优惠,超过400元和享受8折优惠。这里可以直接用if else来判断,因为规则比较少,而当判断条件十分复杂之后,使用规则引擎就会能提高系统的可维护性,也能够提高可扩展性。
本文主要介绍规则引擎easy-rule的基本概念和基本使用,同时也会包含使用SpEL表达式作为条件和操作的例子。

基本概念

name:规则命名
description:规则描述
priority:规则的优先级,数字越小,优先级越高
facts:触发规则时的一组已知事实,底层是一个包含多个类似于哈希表fact的set。
conditions:需要满足的条件
actions:满足条件执行的操作
@Rule:定义规则,包括条件(@Condition)和操作(@Action)
RuleBuilder:通过链式结构构件规则

需求实现

我们就以一开始营销的例子,用几种不同的方式实现。

首先引入相关依赖

        <dependency>
            <groupId>org.jeasy</groupId>
            <artifactId>easy-rules-core</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.jeasy</groupId>
            <artifactId>easy-rules-mvel</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.jeasy</groupId>
            <artifactId>easy-rules-support</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.jeasy</groupId>
            <artifactId>easy-rules-spel</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.2.5.RELEASE</version>

注解实现

定义了价格小于200时的规则

//该注解表示规则
@Rule
public class CutTenRule {

    private Integer price;

    // 该注解标记为条件
    @Condition
    public boolean isLowerThan200(@Fact("price") Integer price) {
        this.price = price;
        return price < 200;
    }

    // 该注解表示条件判断之后的操作
    @Action
    public void printPriceAfterDiscount() {
        System.out.println("折扣规则为减10元\n原价为:"+price+"\n折扣后价格的价格为:" + (price > 10 ? price - 10 : price));
    }

    //该注解表示优先级
    @Priority
    public int getPriority() {
        return 0;
    }

}

用接口实现

定义了价格在200~400之间的折扣规则

// 通过接口的方式标记为条件
public class TenPercentDiscountCondition implements Condition {

    @Override
    public boolean evaluate(Facts facts) {
        Integer price = (Integer) facts.get("price");
        return price >= 200 && price < 400;
    }
    
}

// 通过接口方式标记为条件运行之后的操作
public class TenPercentDiscountAction implements Action {
    @Override
    public void execute(Facts facts) throws Exception {
        Integer price = facts.get("price");
        System.out.println("折扣规则为9折\n原价为:"+price+"\n折扣后的价格为:" + (float)(price * 0.9));
    }
}

规则引擎执行

这样我们就实现了两种方式,接下来就是封装这两个规则。
首先,我们介绍一下规则引擎的几个参数。

规则引擎可配置的参数:

  • skipOnFirstAppliedRule:当一个规则成功应用时,跳过余下的规则。
  • skipOnFirstFailedRule:当一个规则失败时,跳过余下的规则。
  • skipOnFirstNonTriggeredRule:当一个规则未触发时,跳过余下的规则。
  • rulePriorityThreshold:当优先级超过指定的阈值时,跳过余下的规则。

规则引擎的构造方法:

  • DefaultRulesEngine:根据规则的自然顺序(默认为优先级)应用规则。
  • InferenceRulesEngine:在已知的事实上不断地应用规则,直到没有更多的规则可用。
public class DiscountClient {
    public static void main(String[] args) {
        // 创建执行器参数
        RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true);
        // 创建执行期引擎
        DefaultRulesEngine discountEngine = new DefaultRulesEngine(parameters);
        // 链式规则完成接口规则的定义
        Rule tenPercentRule = new RuleBuilder().name("200~400的折扣")
                .description("200~400的折扣")
                .when(new TenPercentDiscountCondition())
                .then(new TenPercentDiscountAction())
                .build();
        // 注解实现方式
        CutTenRule cutTenRule = new CutTenRule();
        // 添加规则
        Rules rules = new Rules();
        rules.register(tenPercentRule);
        rules.register(cutTenRule);
        // 定义事实
        Facts facts = new Facts();
        for (int i = 0; i < 400; i += 9) {
            // 添加事实
            facts.put("price", i);
            // 触发引擎
            discountEngine.fire(rules, facts);
        }
    }
}

运行结果
在这里插入图片描述

组合规则

除了自己添加规则之后,easy-rule还提供了组合规则

  • UnitRuleGroup:单元规则组是作为一个单元使用的组合规则,要么应用所有规则,要么不应用任何规则。
  • ActivationRuleGroup:激活规则组触发第一个适用规则并忽略组中的其他规则。规则首先按照其在组中的自然顺序(默认情况下优先级)进行排序。
  • ConditionalRuleGroup:条件规则组将具有最高优先级的规则作为条件,如果具有最高优先级的规则的计算结果为true,那么将触发其余的规则。

以UnitRuleGroup为例:

		UnitRuleGroup unitRuleGroup = new UnitRuleGroup("单元规则", "单元规则");
        unitRuleGroup.addRule(cutTenRule);
        unitRuleGroup.addRule(tenPercentRule);
        // 添加规则
        Rules rules = new Rules();
        rules.register(unitRuleGroup);

按此规则运行上面的引擎,没有任何输出
将之前的规则200这个临界点两个都适用
可以看到在200的地方都执行了
在这里插入图片描述

监听器

easy-rule还提供了监听器的的功能,在条件执行前等位置都可以提供监听,只要实现监听器接口即可,这里代码见名知义,不再赘述。

public class MyRuleListener implements RuleListener {
    @Override
    public boolean beforeEvaluate(Rule rule, Facts facts) {
        return RuleListener.super.beforeEvaluate(rule, facts);
    }

    @Override
    public void afterEvaluate(Rule rule, Facts facts, boolean evaluationResult) {
//        RuleListener.super.afterEvaluate(rule, facts, evaluationResult);
        System.out.println("condition评估之后");
    }

    @Override
    public void beforeExecute(Rule rule, Facts facts) {
        System.out.println("action执行之前");
//        RuleListener.super.beforeExecute(rule, facts);
    }

    @Override
    public void onSuccess(Rule rule, Facts facts) {
        System.out.println("action执行成功");
//        RuleListener.super.onSuccess(rule, facts);
    }

    @Override
    public void onFailure(Rule rule, Facts facts, Exception exception) {
        System.out.println("action执行失败");
//        RuleListener.super.onFailure(rule, facts, exception);
    }
}

只需要在执行器中添加即可

        // 添加监听器
        discountEngine.registerRuleListener(new MyRuleListener());

执行效果:
在这里插入图片描述

使用Spel

我们以对象为例实现上述200~400的情况
首先创建商品对象

@Data
@AllArgsConstructor
public class Item {
    private int price;
    private String expression;

    public Item(int price) {
        this.price = price;
    }
}

创建spel规则

        SpELRule spelRule = new SpELRule().name("1")
                .description("1")
                .priority(1)
                .when("#{ ['item'].price >= 400 }")
                .then("#{ ['item'].setExpression('折扣规则为8折\n原价为:' + ['item'].price " +
                        "+ '\n折扣后的价格为:'" +
                        " + T(java.lang.Float).parseFloat(['item'].price * 0.8+'') )  }");

在rules中注册

rules.register(spelRule);

测试结果

            facts.put("item", item);
            // 触发引擎
            discountEngine.fire(rules, facts);
            System.out.println(item.getExpression());

运行结果
在这里插入图片描述
执行引擎完整代码:

public class DiscountClient {
    public static void main(String[] args) {
        // 创建执行器参数
        RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true);
        // 创建执行期引擎
        DefaultRulesEngine discountEngine = new DefaultRulesEngine(parameters);
        // 添加监听器
        discountEngine.registerRuleListener(new MyRuleListener());
        // 链式规则完成接口规则的定义
        Rule tenPercentRule = new RuleBuilder().name("200~400的折扣")
                .description("200~400的折扣")
                .when(new TenPercentDiscountCondition())
                .then(new TenPercentDiscountAction())
                .build();
        //spe方式
        SpELRule spelRule = new SpELRule().name("1")
                .description("1")
                .priority(1)
                .when("#{ ['item'].price >= 400 }")
                .then("#{ ['item'].setExpression('折扣规则为8折\n原价为:' + ['item'].price " +
                        "+ '\n折扣后的价格为:'" +
                        " + T(java.lang.Float).parseFloat(['item'].price * 0.8+'') )  }");
        // 注解实现方式
        CutTenRule cutTenRule = new CutTenRule();
        // 创建组合规则
        UnitRuleGroup unitRuleGroup = new UnitRuleGroup("单元规则", "单元规则");
        unitRuleGroup.addRule(cutTenRule);
        unitRuleGroup.addRule(tenPercentRule);
        // 添加规则
        Rules rules = new Rules();
        rules.register(unitRuleGroup);
        rules.register(spelRule);
        // 定义事实
        Facts facts = new Facts();
        for (int i = 0; i < 500; i += 10) {
            // 添加事实
            facts.put("price", i);
            Item item = new Item(i);
            facts.put("item", item);
            // 触发引擎
            discountEngine.fire(rules, facts);
            System.out.println(item.getExpression());
        }
    }
}

总结

执行引擎easy-rule具有强大的解决分支问题的能力,在有多个判断条件时能够使代码的复用性和扩展性提高,同时支持spel等多种表达式,本文主要介绍了简单使用,希望能帮到你~

参考资料

https://juejin.cn/post/7048917724126248967
https://github.com/j-easy/easy-rules
https://zhuanlan.zhihu.com/p/93431125

规则引擎】之easy-rules入门 https://github.com/j-easy/easy-rules 简介   在写业务逻辑时,我们不可避免的会使用到if这样的语法;对于特别复杂的业务场景,那么就可能会写很多"并联"或"串联"的if,冗余又不好管理;此时,我们不妨引入规则引擎。在我看来,规则引擎中的"规则即对应if",规则引擎中的"引擎则是统筹管理这些if"的大脑。   当下规则引擎有很多,如DROOLS、OPENL TABLETS、EASY RULESRULEBOOK等等,其中DROOLS的功能强大且完善,社区也非常活跃,但. 阅读详情

相关推荐

EasyRule学习到实践

本篇关于对easyRule入门级基础使用到代码实践,更多内容需要更多人的实践并研究过程中写下心得及扩展。easyRule是一种简单易用的规则引擎,适用于各种需要基于规则进行决策的场景。通过easyRule,我们可以轻松地定义规则、进行推理和执行,从而实现灵活的业务逻辑处理。本文将带领读者了解easyRule的基本概念、核心功能及其应用场景,并从基础到实践详细讲解easyRule使用方法。

这个人很懒还没时间整理 1145

规则引擎开发

规则引擎的本质,是人类试图在数字世界中建立秩序、传递智慧、应对复杂性的卓越尝试。当企业面对日益复杂的业务逻辑、瞬息万变的市场环境和海量的实时数据时,一种名为“规则引擎”的技术正悄然成为现代软件架构的核心支柱。优秀的规则引擎提供集中的规则知识库,支持规则的检索、比对、模拟测试和生命周期管理。更重要的是,规则引擎的引入需要完善的管理流程、测试框架和监控体系,否则可能引发新的混乱。自适应规则系统:下一代引擎可能具备自我优化能力,通过分析规则执行效果数据,自动建议规则优化、合并或失效,形成动态演进的智能规则生态。

dgwcad_366的博客 146

快速入门Easy Rule规则引擎

return new MVELRule().name("mvel lottery rule").description("mvel表达式创建规则").priority(3).when("user.getMoney() >=100")return new SpELRule().name("SpEL lottery rule").description("SpEl表达式创建规则").priority(4).when("#{['user'].money > 2}"): ,并且支持操作符的优先级和括号强制优先级。

wjianwei666的专栏 325

规则引擎-Easy-Rules

规则引擎Rule Engine)是一种软件组件或应用程序,它允许用户或开发者以业务规则的形式定义复杂的业务逻辑,而无需编写硬编码的代码。这些业务规则可以被动态地管理(添加、删除、修改)和执行,从而允许系统更加灵活和可配置地处理各种业务场景。大多数业务规则可以用以下定义表示:name:规则命名空间中的唯一规则名称description:规则的简要描述priority:规则的优先级facts:触发规则时的一组已知事实。

myITShow的博客 9293

规则引擎easyRule详解

规则引擎有许多种:Drools,Aviator,Mvel,EasyRule,这里主要讲解一下EasyRuleeasyRule集成了Mvel,而Mvel表达式非常强大,我们可以自己写一些表达式,交给mvel进行解析计算,得到这个表达式计算的值。 ...

weixin_43410352的博客 1万+

Easy Rules规则引擎实战

基于规则引擎Easy Rules的业务实战

tmax52HZ的博客 4578

Easy Rules规则引擎终极指南:如何在事件驱动架构中构建高效处理器

Easy Rules是一个受Martin Fowler《Should I use a Rules Engine?》文章启发的Java规则引擎,它提供了简洁的规则抽象和强大的规则执行能力,帮助开发者在事件驱动架构中轻松构建高效的业务规则处理器。作为一款轻量级规则引擎Easy Rules让复杂的业务逻辑变得简单、可维护,特别适合处理需要动态调整规则的场景。 ## 什么是Easy Rules? E

gitblog_00152的博客 1054

终极指南:如何选择Easy Rules的MVEL、SpEL和JEXL表达式引擎

Easy Rules是一个简单易用的Java规则引擎,它支持多种表达式语言来定义业务规则。在本文中,我们将深入探讨MVEL、SpEL和JEXL这三种主流表达式引擎的特点、使用场景和最佳实践。🎯 Easy Rules的核心功能包括轻量级库、易于学习的API、基于POJO的开发以及使用表达式语言定义规则的能力。作为Java规则引擎的佼佼者,Easy Rules让业务规则的实现变得前所未有的简单。

gitblog_00326的博客 560

Easy Rules规则引擎:5分钟快速上手Java业务规则管理

Easy Rules是一个轻量级Java规则引擎,专门为简化业务规则管理而生。无论你是需要处理复杂的业务逻辑,还是想要实现动态的规则配置,Easy Rules都能提供优雅的解决方案。😊 ## 为什么选择Easy Rules? 在当今快速变化的业务环境中,传统的硬编码规则已经无法满足需求。Easy Rules通过将业务规则从代码中分离出来,让规则管理变得更加灵活和可维护。 ### 核心优势一

gitblog_00456的博客 868

Easy Rules数据验证终极指南:基于规则引擎的输入校验框架完整教程

Easy Rules是一款专为Java开发者设计的轻量级规则引擎,它以"简单、愚蠢"为核心理念,帮助开发者轻松实现复杂的业务规则和数据验证逻辑。本文将带你全面了解如何利用Easy Rules构建高效、可维护的输入校验框架,让数据验证变得简单而强大。 ## 📌 为什么选择Easy Rules进行数据验证? 在现代应用开发中,数据验证是确保系统稳定性和安全性的关键环节。传统的硬编码验证方式不仅难

gitblog_01153的博客 407

浅析Easy Rules规则引擎

什么是Easy RulesEasy Rules是一个简单而强大的Java规则引擎,提供以下功能: 轻量级框架和易于学习的API 基于POJO的开发与注解的编程模型 定义抽象的业务规则并轻松应用它们 支持从简单规则创建组合规则的能力 支持使用表达式语言(如MVEL和SpEL)定义规则的能力 在一篇非常有趣的规则引擎的文章中,Martin Fowler说: 您可以自己构建一个简单的规则引擎。您只需要创建一组具有条件和操作的对象,将它们存储在一个集合中,并运行它们来评估conditions和执行acti

吃果冻不吐果冻皮 831

el rule Java_规则引擎-easy rules

easy ruleseasy rulesis a Java rules engine inspired by an article called “Should I use a Rules Engine?” of Martin Fowler in which Martin says:You can build a simple rules engine yourself. All you nee...

weixin_34513436的博客 312

Java规则引擎终极指南:Easy Rules深度解析与实战应用

Easy Rules是一个轻量级、功能强大的Java规则引擎框架,专门为简化业务规则管理而生。无论你是处理复杂的业务逻辑还是构建智能决策系统,这个框架都能让你的代码更加清晰、可维护。本文将带你从零开始,全面掌握Easy Rules的核心概念和实际应用技巧。 ## 🎯 为什么选择Easy Rules? 在当今复杂的业务环境中,传统的if-else语句已经无法满足需求。Easy Rules通过将

gitblog_00298的博客 681

规则引擎Easy Rules 详解

Easy Rules 非常适合需要快速实现业务规则引擎的场景。对于中小型项目,Easy Rules 的简单性和灵活性是一大优势。如果项目规则复杂或者性能要求较高,可以考虑结合 Drools 等更强大的规则引擎使用

weixin_44594317的博客 3973

EasyRules 简单版规则引擎

接触过Drools的同学都会被复杂的Api给难住,简直就是入门到放弃的一个过程,而EasyRule就是Drools的简化版,裁剪了部分使用场景非常少的复杂功能,也简化了很多Drools中的组件,这样我们在使用EasyRule的时候对于API理解就非常容易了 什么是Easy RulesEasy Rules是一个简单的JAVA开源规则引擎,它提供了规则抽象来创建带有评估条件和执行操作的规则规则引擎API通过运行一组规则以评估条件和执行操作。 框架特点 轻量级类库 容易学习的API 基于POJO

琪琪的博客 5929

Java规则引擎easy-rules详细介绍

最近在思考一个基于规则进行挑选的技术重构,想通过规则引擎进行实现,借着这个机会正好可以详细了解一下规则引擎。本篇文章将会详细介绍规则引擎easy-rules使用Easy Rules是一个简单但功能强大的Java规则引擎,提供以下特性: 轻量级框架和易于学习的API 基于POJO的开发 支持从原始规则创建组合规则 支持通过表达式(如MVEL,SPEL和JEXL)定义规则 开始使用 引入依赖 <dependency> <groupId>org.jeasy&l

weixin_64314555的博客 1万+

java开源引擎easyrule_java轻量级规则引擎easy-rules使用介绍

轻量级规则引擎easy-rules--参考我们在写业务代码经常遇到需要一大堆if/else,会导致代码可读性大大降低,有没有一种方法可以避免代码中出现大量的判断语句呢?答案是用规则引擎,但是传统的规则引擎都比较重,比如开源的Drools,不适合在小需求中应用。最近在github上面看到一个傻瓜式的Java规则引擎Easy-Rules,这里结合自己写的demo介绍如何使用这个规则引擎,希望对大家有所...

weixin_39709194的博客 935

Java规则引擎easy-rules详细介绍,java高级程序员面试

name:规则命名空间中的唯一规则名称:规则的简要描述priority:规则的优先级facts:触发规则时的一组已知事实conditions:在给定一些事实的情况下,为了应用该规则,需要满足的一组条件actions:满足条件时要执行的一组操作(可能会添加/删除/修改事实)Easy Rules为定义业务规则的每个关键点提供了抽象。Easy Rules中的规则Rule接口表示:/**此方法封装了规则的条件。@return 如果根据提供的事实可以应用规则,则为true,否则为false*//**

2401_83621541的博客 3019
上一篇: 面试题——说说MySQL引擎MyISAM和InnoDB的区别
下一篇: git add . 时遇到hint: Use -f if you really want to add them.
lonelyMangoo
博客等级 码龄8年 25粉丝 47原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值