我是Scala和Drools Expert的新手,需要一些帮助从Drools会话中获取信息。我已经成功设置了一些受Drools规则操纵的Scala类。现在我想创建一个对象来存储一组输出事实,以便在Drools之外进行处理。这是我得到的。Scala中的Drools Expert输出对象
我有一个简单的对象存储数值结果(在规则的RHS产生的),带有注释字符串一起:
class TestResults {
val results = new MutableList[(Float, String)]()
def add(cost: Float, comment: String) {
results += Tuple2(cost, comment)
}
}
在DRL文件中,我有以下几点:
import my.domain.app.TestResults
global TestResults results
rule "always"
dialect "mvel"
when
//
then
System.out.println("75 (fixed)")
results.add(75, "fixed")
end
当我运行包含此代码,我得到以下错误:
org.drools.runtime.rule.ConsequenceException: rule: always
at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
...
Caused by: [Error: null pointer or function not found: add]
[Near : {... results.add(75, "fixed"); ....}]
^
[Line: 2, Column: 9]
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:997)
这看起来我喜欢我在Scala中定义TestResults对象时出现的一些愚蠢行为,例如Drools编译的Java无法完全看到它。类型不匹配,也许?我无法弄清楚。有什么建议么?谢谢!
是的,这是我错过的一步!错误消息是误导性的。 为了完整起见,下面是有效的快速和肮脏的代码: val results = new TestResults(); ksession.setGlobal(“results”,results); ksession.fireAllRules(); println(results.results.foldLeft(0.0f)((r,c)=> r + c._1)) (可能我应该把这个折叠放在结果对象的方法中......) – Harlan
是你能够在FireAllRules命令后在控制台上打印出结果?我正在做同样的事情,但我没有得到任何错误,但我无法验证什么是返回.... – ProfVersaggi