我是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