如何解决有没有办法在流口水中调用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'且...无效的客户时?”
如果您坚持要这样做,请将日志记录函数的返回类型更改为return 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
我绝对不建议永远这样做。
如果您只是想记录规则的匹配情况,则应该使用listener来实现记录逻辑,而不是污染规则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。