这两天想要做支付路由,要根据支付信息将支付请求转发到不同的支付渠道,可能要用到规则引擎,于是研究了一下开源的规则引擎产品。规则引擎核心知识与开源产品对比选型 ,这篇文章对规格引擎和开源产品有详细的介绍。从文中得知目前活跃的项目有uRule和easyRule。通过询问new bing _,这两个项目的比较如下:

你好,这是必应。我看到你的消息是一个搜索词,是关于 URule 和 EasyRule 的对比。URule 和 EasyRule 都是 Java 规则引擎,但是它们有很大的不同。下面是一些主要的区别¹:

  • URule 是一个成熟的规则引擎,提供了多种规则表达方式,如决策表、决策树、评分卡等,并且提供了基于 Web 的设计器,可以让业务人员直接参与和修改规则。URule 基于 Rete 算法,可以高效地匹配大量的规则和数据。URule 有开源版和商业版,开源版的功能有限,没有高级功能。
  • EasyRule 是一个轻量级的规则引擎,只提供了一种规则表达方式,就是使用 Java 代码或者注解来定义和扩展规则。EasyRule 不需要额外的学习成本,只需要掌握 Java 语言即可。EasyRule 不依赖 Rete 算法,而是按照优先级的顺序执行规则。EasyRule 是完全开源的,没有商业版。

你可以根据你的需求和场景来选择合适的规则引擎。如果你需要一个功能全面、性能高效、可视化友好的规则引擎,你可以考虑 URule;如果你需要一个简单易用、轻量级、基于 Java 代码的规则引擎,你可以考虑 EasyRule。

你对 URule 和 EasyRule 的对比有什么疑问吗?

源: 与必应的对话, 2023/6/2

(1) 规则引擎核心知识与开源产品对比选型 ThinkingInsights. https://ranying666.github.io/2021/03/11/rule-engine/.

(2) Using EasyRule to Manage Firewall Rules - pfSense Documentation. https://docs.netgate.com/pfsense/en/latest/firewall/easyrule.html.

(3) 常见开源规则引擎对比分析_大海梦想的博客-CSDN博客. https://blog.csdn.net/wjc133/article/details/111954160.

(4) EasyRule实战 - 掘金. https://juejin.cn/post/7028949948259368990.

显然,EasyRule是比较合适的。目前EasyRule的最新版本是4.1.0,官方文档地址:https://github.com/j-easy/easy-rules/wiki 而网上的介绍文章大都停留在3.x版本。而EasyRule在4.x后做了较大的变动。我看了下最新文档,根据最新版本写了个组合规则的例子。

首先,在pom文件中增加依赖。需要easy-rules-support,因为组合规则的接口在这个包里。


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

然后,定义两个单独的规则:

package easyrule;

import org.jeasy.rules.annotation.Action;
import org.jeasy.rules.annotation.Condition;
import org.jeasy.rules.annotation.Fact;
import org.jeasy.rules.annotation.Rule; @Rule(name = "Age rule", description = "Check if a person's age is > 18")
public class AgeRule { @Condition
public boolean isAdult(@Fact("person")Person person) {
System.out.println("2222222222222222");
return person.getAge() > 18;
} @Action
public void print(@Fact("person")Person person) {
System.out.println("3333333333333");
System.out.println(String.format("The %s is %d yeas old",person.getName(),person.getAge()));
}
}
package easyrule;

import org.jeasy.rules.annotation.Action;
import org.jeasy.rules.annotation.Condition;
import org.jeasy.rules.annotation.Fact;
import org.jeasy.rules.annotation.Rule; @Rule(name = "Gender rule", description = "Check if a person's gender is male")
public class GenderRule { @Condition
public boolean isMale(@Fact("person")Person person) {
System.out.println("4444444444444444");
return person.getGender().equals("male");
} @Action
public void print(@Fact("person")Person person) {
System.out.println("5555555555555555555555");
System.out.println(String.format("The %s is %s",person.getName(),person.getGender()));
}
}

接着,通过继承UnitRuleGroup 写一个组合接口

package easyrule;

import org.jeasy.rules.annotation.Action;
import org.jeasy.rules.api.Facts;
import org.jeasy.rules.support.composite.UnitRuleGroup; public class MyCompositeRule extends UnitRuleGroup{ public MyCompositeRule() {
System.out.println("1111111111111111");
addRule(new AgeRule());
addRule(new GenderRule());
}
public MyCompositeRule(Object ...rules) {
// register sub rules
for(Object rule : rules) {
addRule(rule);
}
} @Override
public void execute(Facts facts) throws Exception {
//super.execute(facts);
System.out.println("The person is an adult male");
} }

需要注意的是:这个组合规则类不需要@Rule注解,还需要覆写execute方法。

最后,执行引擎

		RulesEngine adultEngine = new DefaultRulesEngine();
Rules rules = new Rules();
rules.register(new MyCompositeRule()); Facts facts = new Facts();
facts.put("person", new Person("tom",19,"male")); adultEngine.fire(rules, facts);

执行结果是:


1111111111111111
2222222222222222
4444444444444444
The person is an adult male

可以看到单独规则里的Action 并没有执行。如果想要单独规则里的Action也执行,需要在组合规则的excute方法里增加一句 super.execute(facts); 这个需要根据实际需求来选择。

以上。

https://wangxuan.me/tech/2023/06/02/use-compsite-rules-in-easyRules.html

规则引擎easyRules中组合规则的使用的更多相关文章

  1. 第2-4-1章 规则引擎Drools介绍-业务规则管理系统-组件化-中台

    目录 规则引擎 Drools 1. 问题引出 2. 规则引擎概述 2.1 什么是规则引擎 2.2 使用规则引擎的优势 2.3 规则引擎应用场景 2.4 Drools介绍 规则引擎 Drools 全套代 ...

  2. 【java规则引擎】规则引擎RuleBase中利用观察者模式

    (1)当RuleBase中有规则添加或删除,利用观察者模式实现,一旦有变动,规则引擎其他组件也做出相应的改变.(2)学习思想:当一个应用中涉及多个组件,为了实现易扩展,解耦思想.可以利用观察者模式实现 ...

  3. 《Drools7.0.0.Final规则引擎教程》Springboot+规则重新加载

    在<Drools7.0.0.Final规则引擎教程>之Springboot集成中介绍了怎样将Drools与Springboot进行集成,本篇博客介绍一下集成之后,如何实现从数据库读取规则并 ...

  4. 规则引擎Drools在贷后催收业务中的应用

    作者:vivo 互联网服务器团队- Feng Xiang 在日常业务开发工作中我们经常会遇到一些根据业务规则做决策的场景.为了让开发人员从大量的规则代码的开发维护中释放出来,把规则的维护和生成交由业务 ...

  5. Asp.net 面向接口可扩展框架之业务规则引擎扩展组件

    随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...

  6. JAVA规则引擎 -- Drools

    Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...

  7. 【java规则引擎】之规则引擎解释

    转载:http://www.open-open.com/lib/view/open1417528754230.html 现实生活中,规则无处不在.法律.法规和各种制度均是:对于企业级应用来说,在IT技 ...

  8. Drools等规则引擎技术对比分析

    项目中需要设计开发一个规则引擎服务,于是调研了业界常用的规则引擎. 常见的规则引擎如下: Ilog JRules 是最有名的商用BRMS: Drools 是最活跃的开源规则引擎: Jess 是Clip ...

  9. 阿里云Web应用防火墙采用规则引擎、语义分析和深度学习引擎相结合的方式防护Web攻击

    深度学习引擎最佳实践 {#concept_1113021 .concept} 阿里云Web应用防火墙采用多种Web攻击检测引擎组合的方式为您的网站提供全面防护.Web应用防火墙采用规则引擎.语义分析和 ...

  10. Node.js躬行记(15)——活动规则引擎

    在日常的业务开发中,会包含许多的业务规则,一般就是用if-else硬编码的方式实现,这样就会增加逻辑的维护成本,若无注释,可能都无法理解规则意图. 因为一旦规则有所改变,那么就需要修改代码再发布代码, ...

随机推荐

  1. React中的key的作用

    一.是什么 首先,给出react组件中进行列表渲染的一个示例: const data = [ { id: 0, name: 'abc' }, { id: 1, name: 'def' }, { id: ...

  2. CF1995E Long Inversions(贪心 + 差分)

    见代码 点击查看代码 //背景:夸一下自己,CF1955A~E均是自己想出来的,这道题思路是自己想的,唯一没想到用差分数组维护 //原理:贪心(想最左边的1开始,不可能对其左边包括自己操作了,否则又要 ...

  3. 第四課-Channel Study File Reader & File Writer

    示例描述:从数据库中读取数据并过滤转换为HL7并存放到指定目录;然后读取目录中的HL7文件转换为txt文本并存放到指定目录. 首先在F:\MirthConnect\Test目录下创建Out目录存放输出 ...

  4. 力扣592(java)-分数加减运算(中等)

    题目: 给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分 ...

  5. 深入理解云计算OpenAPI体系

    ​简介: 就云计算的API来看,当前并没有类似POSIX这样的API标准,基本上各大厂商各自为政.当然,有一些业界主流标准例如OAS获得多数云厂商的支持,但云厂商本身的API却往往由于历史原因.技术路 ...

  6. [Go] 浅谈 Golang Chan 通信与死锁:all goroutines are asleep - deadlock

    Channel创建方式: var c1 chan [value type] c1 = make([channel type] [value type], [capacity]) [value type ...

  7. [Trading] 专业交易: 专业交易员和散户交易员的不同, 什么是专业交易员

    专业交易员可能用的是公司的钱或者自己的钱 有基本工资支持,散户用的是自己的钱 没有人提供工资来做交易. 目标不同,专业交易员的目的是增长投资账户和获得奖金,散户大部分是为了提取盈利收入而无法增长投资账 ...

  8. UWP 写入图片 Exif 信息

    本文告诉大家如何在 UWP 中,保存图片的时候,写入 Exif 信息,也就是如照片的 相机型号 制造商 光圈值等信息的写入 在 UWP 中,保存图片或照片需要用到图片编码器,在使用编码器写入前可以设置 ...

  9. dotnet OpenXml SDK 形状填充渐变色的主题色

    在 Office 文档的一些有趣的设计,颜色和画刷是可以继承的,这个继承包括了属性的继承.在形状填充里面使用的渐变色是可以一部分属性放在主题里面,主要找到主题里面的画刷,替换掉形状自己定义的内容,才是 ...

  10. 2018-11-23-国内好用的-DNS-列表

    title author date CreateTime categories 国内好用的 DNS 列表 lindexi 2018-11-23 12:45:57 +0800 2018-11-23 12 ...