• 浅析Easy Rules规则引擎以及示例


    介绍

    Easy Rules是一个简单而强大的Java规则引擎,提供以下功能:
    1)轻量级框架和易于学习的API
    2)基于POJO的开发与注解的编程模型
    3)定义抽象的业务规则并轻松应用它们
    4)支持从简单规则创建组合规则的能力
    5)支持使用表达式语言(如MVEL和SpEL)定义规则的能力。

    定义规则:

    大多数业务规则可以由以下定义表示:
    名称:规则命名空间中的唯一规则名称
    说明:规则的简要说明
    优先级:相对于其他规则的规则优先级
    事实:去匹配规则时的一组已知事实
    条件:为了匹配该规则,在给定某些事实的情况下应满足的一组条件
    动作:当条件满足时要执行的一组动作(可以添加/删除/修改事实)
    Easy Rules为定义业务规则的每个关键点提供了抽象。
    在Easy Rules中,一个规则由Rule接口表示:evaluate方法封装了必须求值为TRUE 才能触发规则的条件。execute方法封装了在满足规则条件时应执行的操作。条件和动 作ConditionandAction接口表示。
    @Condition注解标记计算规则条件的方法。代表when方法,此方法必须是公共的,可以有一个或多个用@Fact注解的参数,并返回布尔类型。只有一个方法能用@Condition注解。
    @Action注解标记要执行规则操作的方法。代表action方法,规则可以有多个操作。可以使用order属性按指定的顺序执行操作。默认情况下,操作的顺序为0。

    定义事实:

    Facts API是一组事实的抽象,在这些事实上检查规则。在内部,Facts实例持有 HashMap,这意味着:事实需要命名,应该有一个唯一的名称,且 不能为空,任何Java对象都可以充当事实。

    定义规则引擎:

    从版本3.1开始,Easy Rules提供了RulesEngine接口的两种实现:
    DefaultRulesEngine:根据规则的自然顺序(默认为优先级)应用规则。
    InferenceRulesEngine:持续对已知事实应用规则,直到不再应用规则为止。

    直接上代码

    引入pom
    
    <dependency>
        <groupId>org.jeasygroupId>
        <artifactId>easy-rules-coreartifactId>
        <version>4.1.0version>
    dependency>
    
    
    <dependency>
        <groupId>org.jeasygroupId>
        <artifactId>easy-rules-supportartifactId>
        <version>4.1.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    声明规则组件
    @Rule(name = "test1_rule", description = "test1", priority = 1)
    @Slf4j
    public class Test1Rule {
    
      @Condition
      public boolean when(@Fact("ct") Context ct) {
        //此处可以依据Context 对象进行逻辑判断,返回true就会执行action方法
        return true;
      }
    
      @Action
      public void action(@Fact("ct") Context ct) {
       	//此处执行业务逻辑
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    注册规则
    Facts facts = new Facts(); //事实
    facts.put("ct", ct); //事实存入ct对象
    Rules rules = new Rules();
    rules.register(new Test1Rule ()); //注册规则1
    rules.register(new Test2Rule ()); //注册规则2
    rulesEngine.fire(rules, facts); //点火
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    规则引擎参数

    Easy Rules引擎可以配置以下参数:
    参数 类型 默认值
    rulePriorityThreshold int MaxInt
    skipOnFirstAppliedRule boolean false
    rulePriorityThreshold int false
    skipOnFirstFailedRule boolean false
    skipOnFirstNonTriggeredRule boolean false

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

    如:

    RulesEngineParameters parameters = new RulesEngineParameters()
        .rulePriorityThreshold(10)
        .skipOnFirstAppliedRule(true)
        .skipOnFirstFailedRule(true)
        .skipOnFirstNonTriggeredRule(true);
     
    RulesEngine rulesEngine = new DefaultRulesEngine(parameters);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    JAVA学习第六课:java异常处理
    深入理解指针(2)
    MySQL学习笔记(1)——简单操作
    机器学习數據降維之主成分分析(PCA)
    Midjourney视觉垫图
    拼团小程序制作技巧大揭秘:零基础也能轻松掌握
    堆与堆排序
    【Vue】路由
    常见的反爬虫风控 | IP风控
    如何使用MATLAB写测试(3)combinatorial explosion? 参数化!
  • 原文地址:https://blog.csdn.net/wuyongde0922/article/details/128039230