前言

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

而程序员编写的代码也没有任何技术含量,跟着式样书逐字逐句的翻译就行。大量的 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. CF1503E 2-Coloring

    CF1503E 2-Coloring cjx 组合强. 思路 观察一下题目,不难发现只有当黄色形成如下的单峰时才合法. (染错色了,将就一下) 其中两座峰的峰顶高度相加等于 \(m\),为了方便统计, ...

  2. 国产数据库oceanBbase,达梦,金仓与mysql数据库的性能对比 一、比对方法和结果

    最近调研了三款国产化数据库与mysql做对比,调研主要性能指标是大数据写入速度.大数据读取速度以及是否支持分表. 一.测试结果 测试结果与预期的差别很大     1.先说oceanBase社区版这款数 ...

  3. [昌哥IT课堂]|ubuntu18.04手动安装mysql8.0.33 deb包

    前期准备 1.更新aliyun的软件包安装源: 手动更改 用你熟悉的编辑器打开: /etc/apt/sources.list 把源来链接删除或注释: 加入以下命令: ubuntu 18.04 LTS ...

  4. linux虚拟ip原理

    在 Linux 中,虚拟 IP(Virtual IP,VIP)是指一组与物理网络接口卡 (NIC) 绑定的虚拟 IP 地址,这些 IP 地址并不是物理上存在的,而是通过软件模拟实现的. Linux 实 ...

  5. elementUI 表格之合并同类项(包括行和列)

    mergeSpan(tableData, arr) { //["areName","indexCode"] let spanArr = new Array(ta ...

  6. 用vue做类似轮播图的翻页

    左右键 左边的键 <div class="check-prev" onselectstart="return false" :class="{a ...

  7. 从Delphi到Lazarus——Delphi转换器

    0.前言 在Lazarus中使用Delphi编写的文件是一件很简单的事情,这是因为Lazarus可以直接打开Delphi的任何文件,甚至有些文件可以不做任何修改就可以直接使用到你的Lazarus程序中 ...

  8. OSG开发笔记(三十九):OSG中模型的透明度实现、球体透明度Demo

    前言   在OSG中,对于一些效果未被选中或者包含等业务,需要半透明效果来实现.  本篇描述OSG的半透明实现方式.   Demo      透明 功能概述   透明效果在三维场景中扮演着重要角色,它 ...

  9. 不求甚解--详解ansible-playbook中roles的用法(二)

    前言 本文将详细介绍ansible-playbook中roles的各种用法 环境准备 组件 版本 操作系统 Ubuntu 22.04.4 LTS ansible 2.17.6 基本用法 文件结构 . ...

  10. QT日志类SimpleQtLogger的简单记录

    在现代软件开发中,日志记录是必不可少的部分.它不仅帮助开发者在调试和维护软件时了解程序的运行状态,还能提供关键的错误信息.对于使用Qt框架开发应用程序的开发者来说,选择一个合适的日志库至关重要.本文将 ...