drools 规则引擎和 solon-flow 哪个好?solon-flow 简明教程

news/2025/1/29 6:27:28/文章来源:https://www.cnblogs.com/noear/p/18691100

前言

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/875646.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

drools 规则引擎和 solon-flow 哪个好? 规则引擎 solon-flow 简明教程

做电子政务的项目时,经常会有大量的业务逻辑变更,但其实里面的业务改动,其实就是一些业务逻辑变动。而程序员编写的代码也没有任何技术含量,跟着式样书逐字逐句的翻译就行。大量的 `if/else` 判断遍布整个项目,维护难度极大。而这个 solon-flow 流引擎,可以方便的将业务的…

D28 Service 代理模式

当访问Service的IP地址时,流量会转发到后端Pod,那这个转发是怎么实现的呢?Service是一个抽象的资源对象,主要用于定义端口映射规则。具体的流量转发工作由kube-proxy组件负责,它利用主机上的iptables和IPVS技术来实现具体的网络转发,如下图所示:kube-proxy组件默认使用i…

05_LaTeX之排版样式设定

本章内容将一览如何修改 $\LaTeX{}$ 的排版样式。05_\(\LaTeX{}\) 之排版样式设定 目录05_\(\LaTeX{}\) 之排版样式设定字体和字号字体样式字号选用字体宏包字体编码使用 fontspec 宏包更改字体在 ctex 宏包或文档类中更改中文字体使用 unicode-math 宏包配置 Unicode 数学字体…

第十章 输入输出系统

第十章 输入输出系统 本文是对《操作系统真象还原》第十章学习的笔记,欢迎大家一起交流,目前所有代码已托管至 fdx-xdf/MyTinyOS 。 上一章遗留的问题 在上一节中,我们实现了多线程轮转调度,但是当我们运行一段时间后,就会发生GP异常 ​​ 待解决的几个问题:输出中,有些…

【每日一题】20250125

不等和等下去,同样苦涩。【每日一题】已知变量 \(x\) 和变量 \(y\) 的一组成对样本数据为 \((x_i,y_i)(i=1,2,3,\cdotp\cdotp\cdotp,8)\),其中 \(\overline{x}=\frac98\),其回归直线方程为 \(\hat{y}=2x-\frac14\),当增加两个样本数据 \((-1,5)\) 和 \((2,9)\) 后,重新得到…

云手机还是会被检测!还能用来多开吗?

云手机还是会被检测!还能用来多开吗? 云手机确实可以用于多开,但是否会被检测到以及是否安全,取决于多种因素,包括云手机服务提供商的技术、用户的操作方式以及目标应用(如微信、游戏等)的检测机制。以下是关于云手机多开的安全性和可行性的详细分析:云手机多开的原理 …

P1038神经网络

神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向,兰兰同学在自学了一本神经网络的入门书籍后,提出了一个简化模型,…

Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能

大家好,我是编程乐趣。 我们都知道,要实现对结构化的数据(文本)搜索是比较容易的,但是对于非结构化的数据,比如图片,视频就没那么简单了。 但是现在有了AI模型,实现图片分类、搜索等功能,就变得容易很多。 在前面的文章里,我们有提到:Phi-vision 是一个拥有 42 亿参…

E95 01分数规划+树上背包 P1642 规划

视频链接: P1642 规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)// 01分数规划+树上背包 复杂度:n*m*log(1e9) #include <bits/stdc++.h> using namespace std;int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c==-)f=-1;c=getchar();}while(is…

年级第一暗杀计划

[SDOI2008] 仪仗队 题目描述 作为体育委员,C 君负责这次运动会仪仗队的训练。仪仗队是由学生组成的 \(N \times N\) 的方阵,为了保证队伍在行进中整齐划一,C 君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。现在,C 君希望你告诉他队伍整齐…

Burp Suite Professional 2025.1 发布下载,新增功能简介

Burp Suite Professional 2025.1 发布下载,新增功能简介Burp Suite Professional 2025.1 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接:https://sysin.org/blog/burp-suite-pro/ …