浅析Easy Rules规则引擎以及示例
admin
2024-02-14 19:03:28

介绍

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


org.jeasyeasy-rules-core4.1.0

org.jeasyeasy-rules-support4.1.0

声明规则组件

@Rule(name = "test1_rule", description = "test1", priority = 1)
@Slf4j
public class Test1Rule {@Conditionpublic boolean when(@Fact("ct") Context ct) {//此处可以依据Context 对象进行逻辑判断,返回true就会执行action方法return true;}@Actionpublic 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);

相关内容

热门资讯

2025奇葩营销:打破物理定律... 2025年的最后一张日历即将撕下,当车市进入年度盘点时间,最该被“重点标注”的,或许不是扎堆上市的上...
从“设备AI”跨越到“个人AI... 转自 科技魔方 在AI成为关键基础能力的当下,生产力升级与交互体验再造同步发生,社会对“如何把智能真...
“从田野走向世界”晋安建区30... “从田野走向世界”晋安建区30周年主题展启幕 百幅照片见证三十年“城”长记 福州新闻网1...
再添8个国家级名片,四川生态文... 转自:四川在线四川在线记者 张蒙12月25日,生态环境部命名2025年生态文明建设示范区和“绿水青山...
格力集团与珠海安保集团签订战略... 观点网讯:12月30日,格力集团与珠海安保集团正式签订战略合作协议。双方将围绕城市安全、智慧建设、产...