希望使用easy rules api构建java动态规则引擎

希望使用easy rules api构建java动态规则引擎,java,rule-engine,Java,Rule Engine,我有许多规则需要根据数据库中的数据进行评估,我计划使用easyrules api。 我不喜欢在代码中编程或硬编码规则。 构建代码后,更改规则标准应该很容易。 请帮助我如何使其动态和可读性。 Easyrules api坚持每个规则都有一个单独的类,如下所示:我希望以下代码基于易于修改的规则输入动态构建: 我考虑了以下几点,但不确定哪一个是最好的: 1.DB table—具有规则条件的规则表。(我可以使用更新查询来更改规则) 2.JSON或XML 我在其他工具上也很灵活,不局限于easyrules。

我有许多规则需要根据数据库中的数据进行评估,我计划使用easyrules api。 我不喜欢在代码中编程或硬编码规则。 构建代码后,更改规则标准应该很容易。 请帮助我如何使其动态和可读性。 Easyrules api坚持每个规则都有一个单独的类,如下所示:我希望以下代码基于易于修改的规则输入动态构建: 我考虑了以下几点,但不确定哪一个是最好的: 1.DB table—具有规则条件的规则表。(我可以使用更新查询来更改规则) 2.JSON或XML

我在其他工具上也很灵活,不局限于easyrules。


我想你可以参考这一页

它是带有@override的代码

public class DefenseFourthDownRule extends BasicFootballRule {

    // return `true` if the rule should be applied, `false` else
    @Override public boolean evaluate() {
        if (gameState == null) return false;
        if (gameState.down != 4) return false;

        // we know it's 4th down ...
        return true;
    }

    @Override public void execute() {
        System.out.println("4th Down rule fired");
    }
}

我可能会建议您使用java+GroovySrcit引擎。
您可以在GroovyScript中提供规则,并可以使用GroovyEngine动态执行它们。这只是一个想法。

我知道我的答案晚了,但可能会引起其他人的兴趣

我用不同的方式使用easyrules引擎

我只使用一种规则,我可以用easyRule做非常复杂的事情

我的规则是硬编码的,我想可能会对存储在数据库中的规则执行类似的操作

在我的项目中,我需要根据一组复杂的条件从一步走到另一步。每个步骤的条件集都会发生变化。 我的规则引擎将根据当前情况构建一个新的情况

我唯一的规则是,juste持有一个测试对象和一个下一个对象

我有一个current情境对象,它保存了当前情境的所有参数。 它有

  • test()方法只克隆对象(并将ruleEvaluates标志重置为true)
  • 一个next()方法,它只克隆对象(并重置一些参数)
  • 一组“is”方法返回对象本身,但如果条件不匹配,则将ruleEvaluate更改为false
  • 一组“do”方法,在更改相关值后返回对象本身
然后我有一个ruleEngine工厂,根据当前步骤提供一组规则

每个规则引擎都是使用几乎自然的语言编写的

由于“is”方法和“do”方法返回CurrentScience对象,因此我可以轻松地链接测试条件和构建选项

在规则的evaluate()方法中,我只需要测试testObject的RuleEvalue标志是否为true,如果为true,我提供使用next()方法构建的对象

它运行良好,易于维护和阅读。我只需要创建新的“是”和“做”方法来获得更多的能量


我非常感谢马哈茂德·本·哈辛(Mahmoud Ben Hassine)提供了如此简单的规则引擎

这是一个老问题,但到2017年底,Easy Rules可以通过外部文件拥有动态规则

从他们的:


您是否考虑使用JBaseDROLL?有没有使用EasyRe规本身来做这件事的方法?这应该是一个注释。
public class DefenseFourthDownRule extends BasicFootballRule {

    // return `true` if the rule should be applied, `false` else
    @Override public boolean evaluate() {
        if (gameState == null) return false;
        if (gameState.down != 4) return false;

        // we know it's 4th down ...
        return true;
    }

    @Override public void execute() {
        System.out.println("4th Down rule fired");
    }
}
Situation currentSituation = getSituation();    
int priority=0;
Rule rule1 = new Rule(
    "MONDAY_RULE",
    priority++, 
    currentSituation.test().isMonday().isRaining(),
    currentSituation.next().docallMyBoss("won't work today").doGoBackToBed());

....


Rule rule7 = newRule(
    "FRIDAY_RULE",
    priority++,
    currentSituation.test().isFriday().isSunny(),
    currentSituation.next().doBuy("bathing Suit").doPlanWeekendBreak());

register(rule1);
register(rule2);
name: "alcohol rule" 
description: "children are not allowed to buy alcohol" 
priority: 2 condition: "person.isAdult() == false" 
actions: - "System.out.println(\"Shop: Sorry, you are not allowed to buy alcohol\");"