如何在IntelliJ上调试Drools规则?

时间:2017-04-13 02:40:18

标签: java drools

我们有一个使用Drools规则的遗留Java / Spring项目。有没有办法在IntelliJ上调试规则文件,例如添加断点和逐步执行规则逻辑?

3 个答案:

答案 0 :(得分:1)

Drools项目有一个允许调试的Eclipse插件,但据我所知,Idea中的那个没有这个。

答案 1 :(得分:1)

Point of Toni是有效的(Idea插件不允许调试实际的Drools规则)但请注意,您可以在Drools角色调用的实际Java方法上放置断点。以下代码片段将有所帮助(isRuleApplicable和getAttribute是实际的Java方法):

//salience allows to give rules a priority
rule "Number of adults in the family" salience 10
when
    // condition on eligible is required to avoid endless loop
    stbFact: Stb()
    eval(stbFact.getEligible() == null && stbFact.isRuleApplicable("Number of adults in the family") && stbFact.getAttribute("enh_000010", "1", "5"))
then
    System.out.println("[Number of adults in the family] Drools Rule has been satisfied (debug purposes)!!!");
    stbFact.setEligible(Boolean.TRUE);
    update( stbFact );
end

答案 2 :(得分:0)

我要做的是定义一个采用Object类型的param的静态方法。此方法以后可以用作调试回调。这样,您可以在规则的LHS和RHS端进行调试:

class DroolsUtils {
  public static boolean debugLhsValue(Object value) {
    log.debug(value.toString()); // you can set breakpoint here
    return true;
  }
}

与DRL文件相比,您可以使用以下技巧来使用它:

 import function com.bnymellon.ais.rei.dataexchange.brms.runtime.BrmsPluginHelper.debugLhsValue;


  rule "my rule"

  enabled true

  when
    $model : MyModel()
    MyModel(debugLhsValue($model) == true) from $model

    $mapInMyModel: Map() from $model.someMap; 
    MyModel(debugLhsValue($mapInMyModel) == true) from $model

    Entry(getKey() == "something", $myValue: getValue()) from $mapInMyModel.entrySet();
    MyModel(debugLhsValue($myValue) == true) from $model

  then
    debugLhsValue("in RHS");
    // do something 
  end

如上所示,您可以在每条指令后调用此调试功能。您也可以在条件子句中使用它。剩下的唯一事情就是在debugLhsValue内设置断点,然后您知道这些值是什么。