首页 > 其他分享 >规则引擎easyRules中组合规则的使用

规则引擎easyRules中组合规则的使用

时间:2023-06-02 12:12:23浏览次数:40  
标签:rules easyRules person 引擎 jeasy 规则 EasyRule org

这两天想要做支付路由,要根据支付信息将支付请求转发到不同的支付渠道,可能要用到规则引擎,于是研究了一下开源的规则引擎产品。规则引擎核心知识与开源产品对比选型 ,这篇文章对规格引擎和开源产品有详细的介绍。从文中得知目前活跃的项目有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

标签:rules,easyRules,person,引擎,jeasy,规则,EasyRule,org
From: https://www.cnblogs.com/wang1dao/p/17451391.html

相关文章

  • 存储引擎的概念及作用,玩转MySQL
    前言从今天开始,就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深,全面讲解数据库体系。非常适合零基础的小伙伴来学习。全文大约【1567】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带......
  • 【虚幻引擎】UE4源码解析FWorldContent、UWorld、ULevel、UGameInstance、UEngine
    一、UEngineEngine,因为也是很基础的类,再加上开发过程中会经常访问到该类型,因此UE4引擎也在代码全局范围内定义了一个该类型的全局变量:UEngine*GEngine供开发者直接调用。该最基础的类型分化成了两个子类:UGameEngine和UEditorEngine。UGameEngine保存了唯一的一个UGameInstan......
  • UE4是什么?虚幻4引擎是什么?
    UE4的全名是UnrealEngine4,中文译为“虚幻引擎4”。UE4是一款由EpicGames公司开发的开源、商业收费、学习免费的游戏引擎。从1998年发行至今,UE4一共经历了UE、UE2、UE2.5、UE3、UDK、UE4多个版本,它的迭代速度极快,现在已经到了4.22预览版。基于UE4开发的大作无......
  • OpenMLDB v0.8 新功能:离线引擎数据源支持 Amazon S3
    简介AmazonS3(以下简称S3)是一种非常受欢迎的云存储服务,它以其卓越的扩展性、安全性和稳定性而广受全球企业和开发者的喜爱。在新发布的OpenMLDBv0.8.0版本中,新增加了对于AmazonS3作为离线数据源的支持,其带来的主要好处包括:安全性和稳定性:S3提供高级别的安全保障,以保护......
  • 正则表达式:书写规则
        ......
  • 规则引擎的低代码日记——自定义函数编程操作(类excel函数)
    它是技术源码可开放的JAVA规则引擎,采用springcloud+VUE的技术架构进行构建,其中对数据的灵活加工处理采用的是函数式编程的思路(类excel函数配置),是其亮点功能。它允许开发人员定义和管理应用程序的规则,并在应用程序中执行这些规则。在规则引擎中,从数据加工成变量并使用函数式编程......
  • Arrays:自定义排序规则的方式二
          ......
  • Arrays类:自定义排序规则的方式一
         ......
  • bleve搜索引擎是支持基于field搜索的
    QueryStringQueryThequerylanguagequeryallowshumanstodescribecomplexqueriesusingasimplesyntax.TermsPlaintermswithoutanyothersyntaxareinterpretedasamatchqueryfortheterminthedefaultfield.Thedefaultfieldis _allunlessoverri......
  • 配置 prometheus-operator 报警规则
    我们安装好prometheus-operator之后,打开prometheus页面Alerts页面能看到好多报警规则,目前有的还处于报警状态  但是这些报警信息是哪里来的呢?他们应该用怎样的方式通知我们呢?我们知道可以在Prometheus的配置文件之中指定AlertManager实例和报警的rules文件,现在我......