我们有一个使用Drools规则的遗留Java / Spring项目。有没有办法在IntelliJ上调试规则文件,例如添加断点和逐步执行规则逻辑?
答案 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内设置断点,然后您知道这些值是什么。