2011-10-26 37 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