EasyRules规则引擎工具类

本文介绍了EasyRules,一个基于Java的轻量级规则引擎框架,用于快速开发和管理规则。通过一个年龄判断的Demo,展示了如何创建和执行规则。接着,为了应对更复杂的规则表达式,作者封装了EasyRules,包括定义常量类、枚举类和工具类,支持处理如数据质量规则校验等复杂场景。通过这些封装,可以动态构建和执行多层级的规则条件,并提供了测试案例展示其功能。

EasyRules是一款基于Java的开源的轻量级的规则引擎框架。它可以帮助开发人员快速开发并管理规则,实现应用程序的自动化决策。EasyRules框架非常易于使用,且可以与任何Java应用程序无缝集成。在本文中,我们将对其进行一个简单的封装,以实现复杂的规则表达式匹配。

一、EasyRules的基本概念


EasyRules是一个基于规则的引擎,它基于规则引擎的常见原则和概念。以下是一些EasyRules框架中的重要概念:

  • 规则(Rule):规则是EasyRules框架中的核心概念,它用于描述应用程序中需要遵循的规则。每个规则通常包含两个部分:规则名称和规则条件。
  • 规则条件(Condition):规则条件定义了规则的前提条件。如果规则条件为true,则规则将被触发执行。否则,规则将被忽略。
  • 规则动作(Action):规则动作是在规则被触发时执行的一段代码。它可以用于实现各种应用程序逻辑,例如更新数据、发送消息等。
  • 规则执行(Rule Engine):规则执行是EasyRules框架的核心功能之一,它负责解析规则条件,并根据条件执行相应的规则动作。

二、快速上手Demo


了解了easyRules的基本概念后,我们来写一个简单的demo:

假设我们有一个需求,根据用户的年龄来决定是否可以购买酒类产品,如果用户年龄小于18岁,则不能购买酒类产品。

首先,我们需要定义一个规则类,继承自org.jeasy.rules.annotation.Rule,如下所示:

import org.jeasy.rules.annotation.Condition;
import org.jeasy.rules.annotation.Fact;
import org.jeasy.rules.annotation.Rule;

@Rule(name = "age rule", description = "Check if user is of legal age to buy alcohol")
public class AgeRule {
   
   

    @Condition
    public boolean checkAge(@Fact("age") int age) {
   
   
        return age >= 18;
    }
}

在这个规则类中,我们定义了一个名为“checkAge”的条件方法,它接受一个名为“age”的事实参数,并返回一个布尔值表示用户是否满足购买酒类产品的年龄要求。

接下来,我们需要创建一个规则引擎实例,并将规则类添加到规则引擎中。代码如下所示:

import org.jeasy.rules.api.Facts;
import org.jeasy.rules.api.Rules;
import org.jeasy.rules.core.RulesImpl;
import org.jeasy.rules.core.DefaultRulesEngine;

public class RuleEngineDemo {
   
   
    public static void main(String[] args) {
   
   
        AgeRule ageRule = new AgeRule();
        Rules rules = new RulesImpl();
        rules.register(ageRule);
        DefaultRulesEngine rulesEngine = new DefaultRulesEngine();
        Facts facts = new Facts();
        facts.put("age", 20);
        rulesEngine.fire(rules, facts);
    }
}

在这个示例代码中,我们创建了一个名为“ageRule”的规则对象,并将其注册到名为“rules”的规则集合中。接着,我们创建了一个默认的规则引擎实例,并创建了一个名为“facts”的事实对象,并将“age”和“20”作为键值对添加到事实对象中。最后,我们通过调用规则引擎的fire方法来启动规则引擎并触发规则执行。

三、easyRules工具类


以上示例展示了如何快速的使用easyRule实现规则创建及调用的流程。但是如果我们有更复杂的场景,比如在数据质量规则校验中,我们有如下的规则判断:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJC0OufR-1685683113114)(/Users/casey/Library/Application Support/typora-user-images/image-20230329152414895.png)]

对于这种比较复杂且校验规则经常会发生变化的规则,通过上述代码就无法实现了,为此,我将对easyRule做进一步的封装,以达到此目的。

1. 定义常量类

首先定义一个常量类

package com.shsc.bigdata.indicator.monitor.common.constant;

public class EasyRulesConstants {
   
   

    // 事实别名
    public static final String FACT_ALIAS = "fact";
    // 结果别名
    public static final String RESULT_ALIAS = "result";
    // and关系
    public static final String RELATION_AND = "and";
    // or关系
    public static final String RELATION_OR = "or";
    // 匹配成功信息
    public static final String MATCH_SUCCESS_MESSAGE = "匹配成功";
    public static final String FIELD_TYPE = "type";
    public static final String FIELD_OPERATOR = "operator";
    public static final String FIELD_NAME = "metricName";
    public static final String FIELD_VALUE = "value";
    public static final String FIELD_CHILDREN = "children";
    public static final String EXPRESSION_TYPE = "EXPRESSION";
    public static final String RELATION_TYPE = "RELATION";
    public static final String LEFT_BRACKETS = "(";
    public static final String RIGHT_BRACKETS = ")";
    public static final String SYMBOL_SPACE = " ";
    public static final String SYMBOL_EMPTY = "";
    public static final String LOGICAL_AND = "&&";
    public static final String LOGICAL_OR = "||";
}

2. 定义枚举类

定义一个枚举类,罗列出常用的运算符

package com.shsc.bigdata.indicator.monitor.common.enums;

public enum EasyRulesOperation {
   
   
    GREATER_THAN("GREATER_THAN", "%s > %s", "大于"),
    GREATER_THAN_EQUAL("GREATER_THAN_EQUAL", "%s >= %s", "大于等于"),
    LESS_THAN
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值