有没有一种方法可以在drowls中调用void函数



是否有方法调用void函数作为when条件的一部分?我正在尝试拥有自己的函数,该函数具有一些业务逻辑,必须作为每个规则的一部分进行调用。

例如:自定义日志函数,此函数是静态的。

rule "some rule"
when
$instance : Customer(type == "Regular");
eval(Utils.log());
then
......
end

当我执行上面的函数时,会调用该函数,但执行失败

java.lang.RuntimeException: Utils.log() : java.lang.NullPointerException
at org.drools.core.rule.EvalCondition.isAllowed(EvalCondition.java:129)
at org.drools.core.phreak.PhreakEvalNode.doLeftInserts(PhreakEvalNode.java:72)
at org.drools.core.phreak.PhreakEvalNode.doNode(PhreakEvalNode.java:56)
at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:389)

有人能帮我解释一下我如何在何时调用函数吗?

您可以从右侧调用void函数。你不能从左手边看,因为这没有任何意义。左手边应该是条件——空位不是条件。

rule "some rule"
when
Customer(type == "Regular")
then
Utils.log()
end

读作:";如果存在类型为"Regular"的客户,则调用log()函数">

从逻辑上讲,你不能从";当";。这意味着什么"当客户的类型为"Regular"并且。。。空虚">


如果您坚持这样做,请将日志记录函数的返回类型更改为返回true,这样它将始终具有匹配条件不要依赖此日志记录调用的结果来尝试跟踪执行时间或规则执行——它只会告诉你Drools引擎在确定规则匹配时对行进行评估的时间。如果后续条件导致放弃匹配,则日志记录将已经启动。条件子句中的方法应该是纯的并且没有副作用。

public static boolean log() {
// logic
return true;
}
rule "an awful rule don't do this"
when
Customer(type == "Regular")
Boolean (this == true) from Utils.log()
then
// logic
end
rule "another awful rule, still don't do this"
when
Customer( type == "Regular" )
eval( Utils.log() )
then
// logic
end

我绝对不建议这样做


如果你只是想记录规则命中或匹配,你应该使用监听器来实现你的日志逻辑,而不是污染你的规则。

最新更新