1.简述
Easy Rules是一个简单而强大的Java规则引擎,提供以下功能:
- 轻量级框架和易于学习的API
- 基于POJO的开发与注解的编程模型
- 定义抽象的业务规则并轻松应用它们
- 支持从简单规则创建组合规则的能力
- 支持使用表达式语言(如MVEL和SpEL)定义规则的能力
2.EasyRule的支持环境
EasyRule支持jdk1.7以上的版本。
maven依赖
1 | xml复制代码<!--easy rules核心库--> |
3.定义规则引擎
Parameter | Type | Required | Default | content |
---|---|---|---|---|
skipOnFirstAppliedRule | boolean | no | MaxInt | 告诉引擎在规则失败时跳过后面的规则 |
skipOnFirstFailedRule | boolean | no | MaxInt | 告诉引擎一个规则不会被触发跳过后面的规则 |
skipOnFirstNonTriggeredRule | boolean | no | MaxInt | 告诉引擎一个规则不会被触发跳过后面的规则 |
rulePriorityThreshold | boolean | no | MaxInt | 告诉引擎如果优先级超过定义的阈值,则跳过下一个规则。版本3.3已经不支持更改,默认MaxInt |
3.1 rulePriorityThreshold
在创建规则引擎时,我们将其属性 rulePriorityThreshold 的值设置为了 1,这样的设置后的效果相当于在定义的所有规则中将 priority > 1 的规则去掉,换种说法就是只考虑 priority的值小于等于 1 的规则。
3.2 skipOnFirstAppliedRule
所有规则按照优先级从高到低的顺序进行判断,当发现一个满足条件的规则并执行了相关操作后,便不再继续判断其他规则
3.3 skipOnFirstNonTriggeredRule
所有规则按照优先级从高到低的顺序进行判断,如果满足当前的规则,则执行相应的操作,直到遇到不满足条件的规则为止,并且也不会对其他规则进行判断了
1 | scss复制代码RulesEngineParameters parameters = new RulesEngineParameters() |
4.定义规则
4.1 使用rule定义
我们将创建一个始终被触发的规则,在执行时将“hello world”打印到控制台。规则如下:
1 | typescript复制代码public class RuleClass { |
@Condition注解标记计算规则条件的方法。此方法必须是公共的,可以有一个或多个用@Fact注解的参数,并返回布尔类型。只有一个方法能用@Condition注解。
@Action注解标记要执行规则操作的方法。规则可以有多个操作。可以使用order属性按指定的顺序执行操作。默认情况下,操作的顺序为0。
1 | java复制代码 |
4.2 使用RuleBuilder API定义规则
1 | scss复制代码Rule rule = new RuleBuilder() |
4.3 yml文件定义
规则文件的文件名为 rules.yml ,其内容如下
1 | yaml复制代码--- |
客户端调用
1 | java复制代码 |
4.4 MVELRule
1 | scss复制代码 |
5.RuleListener
1 | typescript复制代码public class MyRuleListener implements RuleListener { |
beforeEvaluate
该方法在执行@Condition
修饰的方法之前执行。该方法返回false则不执行条件的判断,直接跳过该当前rule。afterEvaluate
该方法在执行@Condition
修饰的方法之后执行。beforeExecute
该方法在执行@Action
修饰的方法之前执行。onSuccess
该方法在执行@Action
修饰的方法之后执行。onFailure
在执行@Action
修饰的方法出现异常时,该方法执行。
在rulesEngine.fire(rules, facts);
之前注册规则监听器
1 | scss复制代码 ((DefaultRulesEngine) rulesEngine).registerRuleListener(new MyRuleListener()); |
6.RulesEngineListener
1 | typescript复制代码public class MyRulesEngineListener implements RulesEngineListener { |
beforeEvaluate
该方法在执行@Action
修饰的方法之后执行。在RuleListener之前执行afterExecute
该方法在执行@Condition
修饰的方法之前执行。在RuleListener之后执行
在rulesEngine.fire(rules, facts);
之前注册规则引擎监听器
1 | scss复制代码((DefaultRulesEngine) rulesEngine).registerRulesEngineListener(new MyRulesEngineListener()); |
7.运行规则
1 | scss复制代码// create facts |
本文转载自: 掘金