前言

做电子政务的项目时,经常会有大量的业务逻辑变更,但其实里面的业务改动,其实就是一些业务逻辑变动。

而程序员编写的代码也没有任何技术含量,跟着式样书逐字逐句的翻译就行。大量的 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 简明教程的更多相关文章

  1. SpringBoot2 整合 Drools规则引擎,实现高效的业务规则

    本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...

  2. (十五)整合 Drools规则引擎,实现高效的业务规则

    整合 Drools规则引擎,实现高效的业务规则 1.Drools引擎简介 1.1 规则语法 2.SpringBoot整合Drools 2.1 项目结构 2.2 核心依赖 2.3 配置文件 3.演示案例 ...

  3. Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  4. Solon详解(三)- Solon的web开发

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  5. Springboot mini - Solon详解(三)- Solon的web开发

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  6. Solon详解(二)- Solon的核心

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  7. Springboot mini - Solon详解(二)- Solon的核心

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  8. 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 ...

  9. Bear 實驗室: 什麼是Git flow ? 如何在SourceTree使用Git flow管理開發!

      http://www.takobear.tw/12/post/2014/02/bear-git-flow-sourcetreegit-flow.html     Bear 實驗室: 什麼是Git ...

  10. 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则未经解析。

    SELECT CONVERT(VARCHAR(100), 列名) FROM Table 提示错误: 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则 ...

随机推荐

  1. 微服务探索之路05篇jenkins构建net6和vue docker镜像到Harbor自动更新k8s服务镜像

    从1-4篇已经学习了docker Harbor k8s的基本用法.接下来进阶一下使用jenkins结合起来做到自动部署项目. 1 安装jenkins 1.1前提条件 docker环境,可参考第01篇安 ...

  2. Ollma本地部署Qwen2.5 14B(不使用docker)

    部署机器硬件情况: 内存 :32GB 显卡 :3060 为什么不使用docker: 1.网上教程大多以docker为主 2.安装docker的时间太长,在等待的时候顺便尝试一下不用docker的部署 ...

  3. nodejs版本管理工具之n

    转载: https://juejin.cn/post/7065534944101007391 Node.js 对于现在的前端开发人员来说是不可或缺的需要掌握的技能,但我们在使用时避免不了会需要切换不同 ...

  4. Blazor 组件库 BootstrapBlazor 中EditorForm组件介绍

    组件介绍 EditorForm 组件是一个非常实用的组件,当进行数据编辑时,仅需要将 Model 属性赋值即可. 绑定模型默认自动生成全部属性,可以通过设置 AutoGenerateAllItem 更 ...

  5. Mock.js 笔记

    1.介绍 官方文档,Mock.js用来生成随机数据,拦截 Ajax 请求 支持的数据类型丰富,包括文本.数字.布尔值.日期.邮箱.链接.图片.颜色等 功能灵活,生成随机数据 和 拦截 Ajax 请求 ...

  6. QTabWidget的高度取决于当前选项卡的高度

    QTabWidget的高度自适应当前选项卡的高度,可以通过设置其他选项卡的QSizePolicy为Ignored, connect(ui->tabWidget,SIGNAL(currentCha ...

  7. 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器

    1.前言 我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化.本章将要介绍的就是:@Pr ...

  8. 鸿蒙开发之PixelMap介绍与实现图片变换

    本文所学技术可以用在哪 很多读者一看这个文章标题,可能根本不知道能干嘛,且不感兴趣.所以咱们先说说,今天写的这个技术有没有用. 首先,猫林老师即将给大家写的<原生AI之文字识别>就得用到这 ...

  9. .NET Aspire Apps 集成测试

    原文:https://fiodar.substack.com/p/integration-testing-dotnet-aspire-apps 对于软件开发来说,拥有自动化的覆盖测试非常重要.尽管手工 ...

  10. GienTech动态|入选软件和信息技术服务竞争力百强;参展世界计算大会、网络安全博览会

    ​ ​ ---- GienTech动态 ---- 中电金信参展广东省网络安全博览会.世界计算机大会 ​ ​ 近期,中电金信跟随中国电子参展2023年广东省网络安全博览会(下简称"博览会&qu ...