Java Scala中的Drools专家输出对象

Java Scala中的Drools专家输出对象,java,scala,drools,Java,Scala,Drools,我是Scala和Drools专家的新手,需要从Drools会话中获取信息。我已经成功地设置了一些Scala类,这些类由Drools规则进行操作。现在我想创建一个对象来存储一组输出事实,以便在Drools之外进行处理。这是我得到的 我有一个简单的对象,它存储一个数值结果(在规则的RHS中生成),以及一个注释字符串: class TestResults { val results = new MutableList[(Float, String)]() def add(cost:

我是Scala和Drools专家的新手,需要从Drools会话中获取信息。我已经成功地设置了一些Scala类,这些类由Drools规则进行操作。现在我想创建一个对象来存储一组输出事实,以便在Drools之外进行处理。这是我得到的

我有一个简单的对象,它存储一个数值结果(在规则的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无法完全看到它。也许是类型不匹配?我想不出来。有什么建议吗?谢谢大家!

试试看

import my.domain.app.TestResults

global TestResults results

rule "always"
    dialect "mvel"
    when
        //
    then
        System.out.println("75 (fixed)")
        results().add(75.0f, "fixed")
end

我的猜测是类型没有对齐,错误消息很差。(75是整数,需要浮点)

在执行会话之前,需要初始化
结果
全局变量。您可以使用以下命令对其进行初始化:

knowledgeSession.setGlobal("results", new TestResults()))

是的。。并尝试在规则中添加一个条件,使其更有意义(when部分)。 条件评估是规则引擎最重要的功能,编写没有条件的规则没有太多意义


干杯

Hm,似乎没用。我不确定您是否打算在其中包含额外的()集,但如果您这样做,它甚至不会解析。如果没有,它仍然没有帮助:原因:[错误:找不到空指针或函数:add][Near:{…results.add(75.0f,“fixed”);…}]是的,这是我错过的步骤!错误消息具有误导性。为了完整起见,这里有一个快速而肮脏的代码:val results=newtestresults();ksession.setGlobal(“结果”,results);ksession.fireAllRules();println(results.results.foldLeft(0.0f)((r,c)=>r+c._1))(可能我应该将该折叠放在results对象的方法中…)在FireAllRules命令后,您是否能够在控制台上打印结果?我也在做同样的事情,只是我没有收到任何错误,但我无法验证返回的是什么……没有答案,也没有帮助。我知道如何使用生产规则。