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

本文详细介绍了Java规则引擎Easy-Rules的使用,包括引入依赖、定义规则、事实、规则引擎、监听器以及表达式语言支持。Easy-Rules提供轻量级框架,支持基于POJO开发,具备组合规则、规则优先级等功能。文章通过实例展示了如何定义和使用规则,以及错误处理策略。
摘要由CSDN通过智能技术生成

最近在思考一个基于规则进行挑选的技术重构,想通过规则引擎进行实现,借着这个机会正好可以详细了解一下规则引擎。本篇文章将会详细介绍规则引擎easy-rules的使用。

Easy Rules是一个简单但功能强大的Java规则引擎,提供以下特性:

  • 轻量级框架和易于学习的API
  • 基于POJO的开发
  • 支持从原始规则创建组合规则
  • 支持通过表达式(如MVEL,SPEL和JEXL)定义规则

开始使用

引入依赖

<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-rules-core</artifactId>
    <version>4.1.0</version>
</dependency>
复制代码

上面只引入了core模块依赖,如需要其它模块内容,再引入对应依赖即可

定义规则

介绍

大多数业务规则可以用以下定义表示:

  • name:规则命名空间中的唯一规则名称
  • description:规则的简要描述
  • priority:规则的优先级
  • facts:触发规则时的一组已知事实
  • conditions:在给定一些事实的情况下,为了应用该规则,需要满足的一组条件
  • actions:满足条件时要执行的一组操作(可能会添加/删除/修改事实)

Easy Rules为定义业务规则的每个关键点提供了抽象。Easy Rules中的规则由Rule接口表示:

public interface Rule extends Comparable<Rule> {

    /**
    * 此方法封装了规则的条件。
    * @return 如果根据提供的事实可以应用规则,则为true,否则为false
    */
    boolean evaluate(Facts facts);

    /**
    * 此方法封装了规则的操作。
    * @throws 如果在执行操作期间发生错误,则抛出异常
    */
    void execute(Facts facts) throws Exception;

    //Getters and setters for rule name, description and priority omitted.

}
复制代码

evaluate()方法封装了必须为true才能触发规则的条件。execute()方法封装了在满足规则条件时应该执行的操作。条件和操作由ConditionAction接口表示。

规则可以用两种不同的方式定义:

  • 通过在POJO上添加注解来声明
  • 通过RuleBuilder API编程

这些是定义规则的最常用方法,但是如果需要,您也可以实现Rule接口或扩展BasicRule类。

使用注解定义规则

Easy Rules提供了@Rule注解,可以将POJO转换为规则。

@Rule(name = "my rule", description = "my rule description", priority = 1)
public class MyRule {

    @Condition
    public boolean when(@Fact("fact") fact) {
        // 规则条件
        return true;
    }

    @Action(order = 1)
    public void then(Facts facts) throws Exception {
        // 规则为true时的操作1
    }

    @Action(order = 2)
    public void finally() throws Exception {
        // 规则为true时的操作2
    }
}
复制代码

@Condition注解用来标记评估规则条件的方法,这个方法必须是public,可以有一个或多个带@Fact注解的参数,并返回一个boolean类型。只有一个方法可以用@Condition注解标记。

@Action注解用来标记执行操作的方法,规则可以有多个操作。可以使用order属性以指定的顺序执行操作。

使用RuleBuilder定义规则

RuleBuilder允许你用流式API定义规则。

Rule rule = new RuleBuilder()
                .name("myRule")
                .description("myRuleDescription")
                .priority(3)
                .when(condition)
                .then(action1)
                .then(action2)
                .build();
复制代码

在本例中,conditionCondition接口的实例,action1action2Action接口的实例。

组合规则

Easy Rules允许从原始规则创建复杂的规则。一个CompositeRule由一组规则组成。组合规则是一个抽象概念,因为组合规则可以以不同的方式触发。Easy Rules提供了3种Compos

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,以下是 easy-rules-core 版本为 3.2.0 的使用示例代码: 首先,我们需要定义一个规则: ```java public class AgeRule extends BasicRule { private int age; public AgeRule(int priority, int age) { super("AgeRule", "Check if age is greater than 18", priority); this.age = age; } @Override public boolean evaluate(Facts facts) { int age = facts.get("age"); return age > this.age; } @Override public void execute(Facts facts) throws Exception { System.out.println("Age is greater than 18"); } } ``` 在这个规则中,我们检查一个名为 "age" 的事实是否大于18。如果是,我们将打印一条消息。 接下来,我们需要创建一个规则引擎,并将规则添加到其中: ```java Rules rules = new Rules(); rules.register(new AgeRule(1, 18)); RulesEngine rulesEngine = new DefaultRulesEngine(); rulesEngine.fire(rules, new Facts()); ``` 在这个例子中,我们创建了一个规则引擎并将 AgeRule 添加到其中。然后,我们使用一个空的 Facts 对象来启动规则引擎。 当我们运行这段代码时,因为我们提供的 "age" 事实的值为0,所以我们不会看到任何输出。 我们可以通过将 "age" 事实的值设置为20来测试规则: ```java Rules rules = new Rules(); rules.register(new AgeRule(1, 18)); Facts facts = new Facts(); facts.put("age", 20); RulesEngine rulesEngine = new DefaultRulesEngine(); rulesEngine.fire(rules, facts); ``` 当我们运行这段代码时,我们将在控制台上看到 "Age is greater than 18" 的消息。 希望这个示例能够帮助你理解如何使用 easy-rules-core 版本为 3.2.0。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值