基于 Java 的简单规则引擎,具有后备功能

     2023-05-08     27

关键词:

【中文标题】基于 Java 的简单规则引擎,具有后备功能【英文标题】:Java based simple rule engine with fallback 【发布时间】:2021-01-08 00:23:53 【问题描述】:

我需要实现一个具有分层回退支持的简单规则引擎。我已经查看了 DROOLS 库,但我不确定它是否支持我的用例。

用例相当简单,这让我开始思考是否需要一个规则引擎?不过,这里是用例 -

我有一个包含一堆字段的模态

Public Class Entity 
    public int val0;
    public int val1;
    public int val2;
    public int val3;
    .....

现在,我想针对这些字段创建如下规则

RULE1 --- IF val0 == 1 && val1 == 1 && val2 == 1 && val3 == 1 --- (1,1,1,1) THEN DO this
RULE2 --- IF val0 == 1 && val1 == 1 && val2 == 1 && val3 == 2, --- (1,1,1,2) THEN DO this
RULE3 --- IF val0 == 1 && val1 == 1 && val2 == 1 && val3 == *, --- (1,1,1,*) THEN DO this
RULE4 --- IF val0 == 1 && val1 == 1 && val2 == * && val3 == *, --- (1,1,*,*) THEN DO this 

问题在于RULE3RULE4,其中 val2 和 val3 可以匹配任何值。

例如

val0=1, val1=1, val2=1, val3=1 -- should execute RULE1 - specific match
val0=1, val1=1, val2=1, val3=3 -- should execute RULE3 - generic match as there's no specific match for val3
val0=1, val1=1, val2=10, val3=5 -- should execute RULE4 - generic match as there's no specific match for val2 and val3

因此,根据查询,要么我会找到匹配规则,要么我将不得不回退到更通用的规则。是否有任何现有的规则引擎库提供此功能,或者我什至需要规则引擎库来实现此功能?

【问题讨论】:

一个完整的规则引擎对于只有几个变体的东西来说似乎有点矫枉过正,但这取决于你正在做的事情的完整背景以及你以后可能需要做的事情。 【参考方案1】:

起初我以为您可能想考虑使用按位逻辑,但是由于某些字段采用非二进制值,这可能对您不起作用。

但是,解决方案不必那么复杂。只需创建一个作为 Entity 值匹配器的类,然后使用 if-else 语句链来查找匹配项。

class EntityMatcher 

    private Integer val0, val1, val2, val3;

    /** Constructor used to match all the parameters */
    EntityMatcher(int val0, int val1, int val2, int val3) 
        // set fields 0-3
    

    /** Constructor used when you don't care about val2 & val3 */
    EntityMatcher(int val0, int val1) 
        // set fields 0 & 1, leaving val2 and val3 as null
    

    boolean matches(Entity toMatchAgainst) 
        return (this.val0 == null || this.val0 == toMatchAgainst.val0)
            && (this.val1 == null || this.val1 == toMatchAgainst.val1)
            ...
            && (this.valN == null || this.valN == toMatchAgainst.valN);
    


那么你的规则引擎可能看起来像这样:

if (new EntityMatcher(1, 1, 1, 1).matches(entity))
    // Rule 1
else if (new EntityMatcher(1, 1, 1, 2).matches(entity))
    // Rule 2
...
else if (new EntityMatcher(1, 1).matches(entity))
    // Rule 4
...
else
   // no match

这与case classes in Scala基本相同。

【讨论】:

几款不错的java规则引擎

...但是官方文档还是很不错的EasyRules官方的介绍,傻瓜式的基于pojo的规则引擎,使用简单,同时也比较强大,支持bdd模式的规则处理,对于java系统的集成很友好 使用简单,同时支持基于文件的规则加载,当然了,接口是可扩... 查看详情

规则引擎easyrules介绍,应用及示例(代码片段)

...擎,提供以下功能:轻量级框架和易于学习的API基于POJO的开发与注解的编程模型定义抽象的业务规则并轻松应用它们支持从简单规则创建组合规则的能力支持使用表达式语言(如MVEL和 查看详情

规则表达式引擎框架

...式转换为计算机可以理解运行的计算规则。表达式引擎是基于编程语言的基础之上编译原理的一种实现。     jfireEL——高性能EL表达式解析框架jfireEL是快速的EL表达式解析器,支持丰富的EL表达式,7倍于SpringEL的超高... 查看详情

常用规则引擎

...java规则引擎,它有以下特性:轻量级框架,学习成本低基于POJO为定义业务引擎提供有用的抽象和简便的应用从原始的规则组合成复杂的规则它主要包括几个主要的类或接口:Rule,RulesEngine,RuleListener,Facts还有几个主要的注解:@Acti... 查看详情

drools开源规则引擎比较难上手,有没有一款容易上手的规则引擎?

参考技术ADrools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。本文所使用的demo已上传htt... 查看详情

springboot2整合drools规则引擎,实现高效的业务规则

...||GitEE·点这里一、Drools引擎简介1、基础简介Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环... 查看详情

具有良好接口的开源规则引擎,用于编写规则

】具有良好接口的开源规则引擎,用于编写规则【英文标题】:Opensourcerulesenginewithdecentinterfaceforwritingrules【发布时间】:2010-09-0612:16:54【问题描述】:我正在尝试找到一个开源业务规则引擎,该引擎具有用于构建规则的良好界... 查看详情

java规则引擎及jsr-94[转]

...p;   Java规则引擎是推理引擎的一种,它起源于基于规则的专家系统。     Java规则引擎将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。Java规则引擎接受数据输入,解... 查看详情

java规则引擎--drools

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

基于协同过滤的推荐引擎

...荐;爱奇艺、乐视根据向用户推荐电影;(二)推荐算法基于关系规则推荐:用户A经常同时购买了哪些商品,分析这些商品的关联规则,则用户B购买其中某一商品,可推荐其它商品;基于内容推荐:用户喜欢A电影,B电影和A属... 查看详情

我想我需要一个简单的规则引擎? [关闭]

】我想我需要一个简单的规则引擎?[关闭]【英文标题】:Ineedasimplerulesengine,Ithink?[closed]【发布时间】:2011-05-1819:24:44【问题描述】:我需要一些关于解决此问题的最佳方法的建议。我研究了DROOLS、Java规则引擎和其他一些。所有... 查看详情

springboot+drools规则引擎整合

目的官方的Drools范例大都是基于纯Java项目或Maven项目,而基于SpringBoot项目的很少。本文介绍如何在SpringBoot项目上加上Drools规则引擎。POM依赖POM文件如下:<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-i... 查看详情

beetl:新一代java模板引擎典范

Beetl是BeeTemplateLanguage的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。什么是BeetlBeetl目前版本是2.8.5,相对于其他java模板引擎,具有功能... 查看详情

具有 Java 绑定能力的简单模板库

】具有Java绑定能力的简单模板库【英文标题】:SimpletemplatelibrarywithbindingcapabilityforJava【发布时间】:2016-02-1616:04:07【问题描述】:我想在模板引擎的帮助下生成有效的JSON。特别是,我希望引擎将模板中的占位符替换为模型类的... 查看详情

规则引擎选型及简单应用

规则引擎实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程,使用规则引擎可以把复杂、冗余... 查看详情

drools7hellowrold入门详细步骤--系列01课(代码片段)

...上,引用这个文档上的规则二、drools规则引擎有什么用?简单来说就是将多变的规则,从业务代码中剥离出来(当规则变了之后,不用修改代码,而是修改一份文本,这样就可以不用编译,打包,上线,这些过程就省略了,省了... 查看详情

基于 Python 规则的引擎 [关闭]

】基于Python规则的引擎[关闭]【英文标题】:PythonRuleBasedEngine[closed]【发布时间】:2019-04-2413:53:37【问题描述】:我希望设计一个基本上需要根据输入做出决策的系统。输入将是一个人。classPerson:def__init__(self,name,age,sex,weight,height,... 查看详情

springboot中如何整合groovy实现一个轻量级规则引擎(代码片段)

...启的情况下来动态的加载外部脚本,可以看做是一个基于groovy封装的轻量级【规则引擎】。1、为什么选择groovy在实际的平台化项目中,为了提升平台抽象能力使用更多场景,引入了规则引擎。如一个用户购买了500元... 查看详情