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

标签 java implementation rule-engine business-rules

我需要实现一个具有分层后备支持的简单规则引擎。我已经研究过 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

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

最佳答案

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

但是,解决方案不必那么复杂。只需创建一个充当 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 的简单规则引擎,具有后备功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64000201/

相关文章:

java - JavaFX究竟如何启动

java - 如何根据其符号名称检索 Bundle?

algorithm - 用于移动设备的 j2me 中的导航算法实现

C++ toUpper 实现

java - Drools 知识库大小

drools - Drools 7.57.0.Final 中的模式匹配问题

java - 使用 JAXB 将对象的内容放入不同类型的新实例中

java - 如何优化 AppEngine Java/JDO 数据存储 put() 以使用更少的写入

php - 单项执行出错

java - 当具有包含无限循环的函数(监视器)时如何在 Drools 中触发规则?