网站首页 > 博客文章 正文
1. Easy Rules 概述
1.1 基本概念
Easy Rules是一个Java规则引擎,灵感来自一篇名为《Should I use a Rules Engine?》的文章
规则引擎就是提供一种可选的计算模型。与通常的命令式模型(由带有条件和循环的命令依次组成)不同,规则引擎基于生产规则系统。这是一组生产规则,每条规则都有一个条件(condition)和一个动作(action)———— 简单地说,可以将其看作是一组if-then语句。
了解规则引擎,我们先了解几个概念,如图所示:
我们看到
- 1)facts表示当前被传入的key:value结构的参数
- 2)rule就是一整个规则
- 3)Condition就是rule的判断条件
- 4)action就是满足Condition以后需要触发的动作
那么整个逻辑就是,当一个facts参数对象传入的时候,遍历rules各个规则,每个规则进行规则的条件判断,如果满足条件,那么就触发执行相应的业务逻辑。精妙之处在于规则可以按任何顺序编写,引擎会决定何时使用对顺序有意义的任何方式来计算它们。
1.2 定义规则的多种方式
方式一:注解
@Rule(name = "weather rule", description = "if it rains then take an umbrella")
public class WeatherRule {
@Condition
public boolean itRains(@Fact("rain") boolean rain) {
return rain;
}
@Action
public void takeAnUmbrella() {
System.out.println("It rains, take an umbrella!");
}
}
方式二:链式编程
Rule weatherRule = new RuleBuilder()
.name("weather rule")
.description("if it rains then take an umbrella")
.when(facts -> facts.get("rain").equals(true))
.then(facts -> System.out.println("It rains, take an umbrella!"))
.build();
方式三:表达式
Rule weatherRule = new MVELRule()
.name("weather rule")
.description("if it rains then take an umbrella")
.when("rain == true")
.then("System.out.println(\"It rains, take an umbrella!\");");
方式四:yml配置文件
例如:weather-rule.yml
name: "weather rule"
description: "if it rains then take an umbrella"
condition: "rain == true"
actions:
- "System.out.println(\"It rains, take an umbrella!\");"
1.3 可以通过RuleListener API来监听规则执行事件
public interface RuleListener {
/**
* 在评估规则之前触发。
*
* @param rule 正在被评估的规则
* @param facts 评估规则之前的已知事实
* @return 如果规则应该评估,则返回true,否则返回false
*/
default boolean beforeEvaluate(Rule rule, Facts facts) {
return true;
}
/**
* 在评估规则之后触发
*
* @param rule 评估之后的规则
* @param facts 评估规则之后的已知事实
* @param evaluationResult 评估结果
*/
default void afterEvaluate(Rule rule, Facts facts, boolean evaluationResult) { }
/**
* 运行时异常导致条件评估错误时触发
*
* @param rule 评估之后的规则
* @param facts 评估时的已知事实
* @param exception 条件评估时发生的异常
*/
default void onEvaluationError(Rule rule, Facts facts, Exception exception) { }
/**
* 在规则操作执行之前触发。
*
* @param rule 当前的规则
* @param facts 执行规则操作时的已知事实
*/
default void beforeExecute(Rule rule, Facts facts) { }
/**
* 在规则操作成功执行之后触发
*
* @param rule t当前的规则
* @param facts 执行规则操作时的已知事实
*/
default void onSuccess(Rule rule, Facts facts) { }
/**
* 在规则操作执行失败时触发
*
* @param rule 当前的规则
* @param facts 执行规则操作时的已知事实
* @param exception 执行规则操作时发生的异常
*/
default void onFailure(Rule rule, Facts facts, Exception exception) { }
}
注册监听器到执行引擎上
DefaultRulesEngine rulesEngine = new DefaultRulesEngine();
rulesEngine.registerRuleListener(myRuleListener);
2.示例
在你的javaweb工程的pom.xml中添加以下依赖
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-rules-core</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-rules-support</artifactId>
<version>4.1.0</version>
</dependency>
2.1 示例1-判断奇偶数
2.1.1 创建偶数判断规则
2.1.2 创建测试方法
2.1.3 测试结果
2.2 示例2-判断性别
2.2.1 创建变量类
2.2.2 创建2个规则类
2.2.3 创建测试类
2.2.4 测试结果
猜你喜欢
- 2024-12-30 IF嵌套层数太多?试试Drools规则引擎
- 2024-12-30 低代码开发重要工具:jvs-logic(逻辑引擎)基础原理与功能架构
- 2024-12-30 Java逻辑引擎服务编排,零代码低成本解决企业复杂业务需求
- 2024-12-30 JVS开源框架系列:多租户管理「含开源地址」
- 2024-12-30 开启灵活开发编码模式:规则引擎drools——基础语法
- 2024-12-30 Aviator规则引擎最佳实践 ilog规则引擎
- 2024-12-30 使用若依框架开发和部署简单应用的基本过程
- 2024-12-30 认识工作流程引擎 认识工作流程引擎教案
- 2024-12-30 开源规则引擎LiteFlow项目应用实践
- 2024-12-30 JAVA工作流「java工作流引擎框架」
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- 系统设计图 (58)
- powershellfor (73)
- messagesource (71)
- plsql64位 (73)
- vueproxytable (64)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- nacos启动失败 (64)
- ssh-add (70)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)