2011-10-26 31 views
3

我是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无法完全看到它。类型不匹配,也许?我无法弄清楚。有什么建议么?谢谢!

回答

2

您需要初始化您的results全局变量,然后执行您的会话。您可以使用初始化:

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

是的,这是我错过的一步!错误消息是误导性的。 为了完整起见,下面是有效的快速和肮脏的代码: val results = new TestResults(); ksession.setGlobal(“results”,results); ksession.fireAllRules(); println(results.results.foldLeft(0.0f)((r,c)=> r + c._1)) (可能我应该把这个折叠放在结果对象的方法中......) – Harlan

+0

是你能够在FireAllRules命令后在控制台上打印出结果?我正在做同样的事情,但我没有得到任何错误,但我无法验证什么是返回.... – ProfVersaggi

0

尝试

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是一个Int,想要一个浮点数)

+0

嗯,似乎没有帮助。我不确定你是否想在那里增加一些(),但是如果你这样做,它甚至不会解析。如果没有,它仍然没有帮助: 引起:[错误:空指针或函数未找到:添加] [Near:{... results.add(75.0f,“fixed”); ....}] – Harlan

-1

这是正确的..并试图将一个条件添加到您的规则,所以它更有意义(该部分时)。 条件评估是规则引擎最重要的特征,无条件编写规则不会产生太多的意义。

干杯

+0

不是一个答案,没有帮助。我知道如何使用生产规则。 – Harlan