drools 规则引擎和 solon-flow 哪个好? 规则引擎 solon-flow 简明教程
前言
做电子政务的项目时,经常会有大量的业务逻辑变更,但其实里面的业务改动,其实就是一些业务逻辑变动。
而程序员编写的代码也没有任何技术含量,跟着式样书逐字逐句的翻译就行。大量的 if/else 判断遍布整个项目,维护难度极大。
而这个 solon-flow 流引擎,可以方便的将业务的整体逻辑移出,更加方便程序的可读性。
准备
第一步 随便建个 maven 项目
第二步 添加 solon-flow 依赖
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-flow</artifactId>
<version>3.0.7</version>
</dependency>
第三步 在 src\main\resources\flow 下面添加规则文件,规则文件可以是 json 或者 yml 结尾(这里用 yml 格式,简明些)
案例一
先创建个实体类:
public class Order {
private Double originalPrice;//订单原始价格,即优惠前价格
private Double realPrice;//订单真实价格,即优惠后价格
public String toString() {
return "Order{" + "originalPrice=" + originalPrice + ", realPrice=" + realPrice + '}';
}
public Double getOriginalPrice() {
return originalPrice;
}
public void setOriginalPrice(Double originalPrice) {
this.originalPrice = originalPrice;
}
public Double getRealPrice() {
return realPrice;
}
public void setRealPrice(Double realPrice) {
this.realPrice = realPrice;
}
}
创建 bookDiscount.yml 文件,建立相应处理链(或者规则链)。链有3个节点, start 和 end 表示链条的开头与结尾,book_discount_1 为规则执行节点:
id: "book_discount"
nodes:
- type: "start"
- id: "book_discount_1"
when: "order.getOriginalPrice() < 100"
task: |
order.setRealPrice(order.getOriginalPrice());
System.out.println("没有优惠");
- type: "end"
@Test
public void case1() throws Throwable {
FlowEngine flowEngine = FlowEngine.newInstance();
flowEngine.load(Chain.parseByUri("classpath:flow/bookDiscount.yml"));
BookOrder bookOrder = new BookOrder();
bookOrder.setOriginalPrice(10);
ChainContext ctx = new ChainContext();
ctx.put("order", bookOrder);
flowEngine.eval("book_discount", ctx);
//价格没变,还是10块
assert bookOrder.getRealPrice() == 10;
}
单测运行结果:
没有优惠
案例二
在原来的处理链上,添加新的规则
id: "book_discount"
nodes:
- type: "start"
- id: "book_discount_1"
when: "order.getOriginalPrice() < 100"
task: |
order.setRealPrice(order.getOriginalPrice());
System.out.println("没有优惠");
- id: "book_discount_4"
when: "order.getOriginalPrice() >= 300"
task: |
order.setRealPrice(order.getOriginalPrice() - 100);
System.out.println("优惠100元");
- id: "book_discount_2"
when: "order.getOriginalPrice() < 200 && order.getOriginalPrice() > 100"
task: |
order.setRealPrice(order.getOriginalPrice() - 20);
System.out.println("优惠20元");
- type: "end"
流处理示意图:

单测参考:
@Test
public void case4() throws Throwable {
FlowEngine flowEngine = FlowEngine.newInstance();
flowEngine.load(Chain.parseByUri("classpath:flow/bookDiscount.yml"));
BookOrder bookOrder = new BookOrder();
bookOrder.setOriginalPrice(500);
ChainContext ctx = new ChainContext();
ctx.put("order", bookOrder);
flowEngine.eval("book_discount", ctx);
//价格变了,省了100块
assert bookOrder.getRealPrice() == 400;
}
@Test
public void case2() throws Throwable {
FlowEngine flowEngine = FlowEngine.newInstance();
flowEngine.load(Chain.parseByUri("classpath:flow/bookDiscount.yml"));
BookOrder bookOrder = new BookOrder();
bookOrder.setOriginalPrice(120);
ChainContext ctx = new ChainContext();
ctx.put("order", bookOrder);
flowEngine.eval("book_discount", ctx);
//省了20块
assert bookOrder.getRealPrice() == 100;
}
内置脚本能力说明
- when,使用 java 完整语法的表达式,可以直接使用链上下里的模块变量,要求返回布尔值
- task,使用 java 完整语法的代码块,可以直接使用链上下里的模块变量
更多 solon-flow 的说明,可参考 solon-flow 官网资料。
drools 规则引擎和 solon-flow 哪个好? 规则引擎 solon-flow 简明教程的更多相关文章
- SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...
- (十五)整合 Drools规则引擎,实现高效的业务规则
整合 Drools规则引擎,实现高效的业务规则 1.Drools引擎简介 1.1 规则语法 2.SpringBoot整合Drools 2.1 项目结构 2.2 核心依赖 2.3 配置文件 3.演示案例 ...
- Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- Solon详解(三)- Solon的web开发
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Springboot mini - Solon详解(三)- Solon的web开发
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Solon详解(二)- Solon的核心
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Springboot mini - Solon详解(二)- Solon的核心
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- Intel® Threading Building Blocks (Intel® TBB) Developer Guide 中文 Parallelizing Data Flow and Dependence Graphs并行化data flow和依赖图
https://www.threadingbuildingblocks.org/docs/help/index.htm Parallelizing Data Flow and Dependency G ...
- Bear 實驗室: 什麼是Git flow ? 如何在SourceTree使用Git flow管理開發!
http://www.takobear.tw/12/post/2014/02/bear-git-flow-sourcetreegit-flow.html Bear 實驗室: 什麼是Git ...
- 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则未经解析。
SELECT CONVERT(VARCHAR(100), 列名) FROM Table 提示错误: 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则 ...
随机推荐
- 2024-11-16:哈沙德数。用go语言,如果一个整数能够被它的各个数位上数字的和整除, 我们称这个整数为哈沙德数(Harshad number)。 给定一个整数 x, 如果 x 是哈沙德数,则返回
2024-11-16:哈沙德数.用go语言,如果一个整数能够被它的各个数位上数字的和整除, 我们称这个整数为哈沙德数(Harshad number). 给定一个整数 x, 如果 x 是哈沙德数,则返回 ...
- token、cookie、session的区别
token是验证用户身份的令牌,通常是用于接口的身份验证,一般获取之后放在请求头中 cookie和session的区别: cookie是服务器发送到客户端然后存储在客户端的,可以用来保持用户的登录信息 ...
- csv导出特殊字符问题
昨天听到隔壁组讨论说按照逗号分割implode导出到csv文件,传递文件数据给别人的时候,别人按照都好explode分割回来多一个单元格,他们调查了一下发现是内容里面就是有逗号导致的,居然就这么卡住了 ...
- openjdk和jdk的区别与联系
使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的openjdk,那么到底什么是openjdk,它与sun jdk有什么关系和区别呢?历史上的原 ...
- Java方法参数太多怎么办—Part 1—自定义类型
本文由 ImportNew - 王村平 翻译自 dzone.如需转载本文,请先参见文章末尾处的转载要求. 本文是这个系列的第一篇文章,介绍了采用自定义类型处理参数过多的问题.如果你也希望参与类似的系列 ...
- js返回的字符串中添加空格
labelFormatter: function() { return `${this.name}\xa0\xa0\xa0${this.y}%`; } 使用"\xa0"
- Xpath解析及其语法
XPath解析 XPath(XML Path Language)是一种用于在XML和HTML文档中查找信息的语言,其通过路径表达式来定位节点,属性和文本内容,并支持复杂查询条件,XPath 是许多 W ...
- 基于 C# 编写的 Visual Studio 文件编码显示与修改扩展插件
前言 在软件开发过程中,尤其是在处理跨平台或来自不同来源的项目时,文件的编码格式往往会成为一个不可忽视的问题.不同的操作系统.编程语言和编辑器可能对文件编码有不同的支持和默认设置,这可能导致在打开一个 ...
- 【kernel】从 /proc/sys/net/ipv4/ip_forward 参数看如何玩转 procfs 内核参数
本文的开篇,我们先从 sysctl 这个命令开始. sysctl 使用 sysctl 是一个 Linux 系统工具,后台实际上是 syscall,它允许用户查看和动态修改内核参数. # 查看当前设置的 ...
- 10C++选择结构(4)
一.switch语句 问题:风之巅小学规定,若测试成绩大于或等于90分为"A",大于或等于70分小于90分为"B",大于或等于60分小于70分为"C& ...