当前位置: 首页 > 工具软件 > Easy Rules > 使用案例 >

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

董意蕴
2023-12-01

介绍

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<String,Object>,这意味着:事实需要命名,应该有一个唯一的名称,且 不能为空,任何Java对象都可以充当事实。

定义规则引擎:

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

直接上代码

引入pom

<!--easy rules核心库-->
<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-rules-core</artifactId>
    <version>4.1.0</version>
</dependency>

<!--规则定义文件格式,支持json,yaml等-->
<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-rules-support</artifactId>
    <version>4.1.0</version>
</dependency>

声明规则组件

@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) {
   	//此处执行业务逻辑
  }
}

注册规则

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); //点火

规则引擎参数

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

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

如:

RulesEngineParameters parameters = new RulesEngineParameters()
    .rulePriorityThreshold(10)
    .skipOnFirstAppliedRule(true)
    .skipOnFirstFailedRule(true)
    .skipOnFirstNonTriggeredRule(true);
 
RulesEngine rulesEngine = new DefaultRulesEngine(parameters);
 类似资料: