2015-12-03 51 views
1

我正在使用AgendaFilter來決定是否應該執行規則激活。 作爲我工作記憶事實的一部分,我根據規則插入一個「規則配置」事實,其中包含我的規則被允許執行的頻率(以及相應的計數器)。 我注意到Match.getFactHandles()只返回'創建此匹配'的事實(按照java文檔)。 有沒有辦法訪問WorkingMemory及其所有事實,還是我基本上必須聲明我的「規則配置」事實作爲我的條件的一部分?舉例來說明:現在我做了類似下面這樣的事情,我想知道我是否可以在規則中聲明$ruleConfig事實,但仍然可以在AgendaFilter中查找它。在drools中,我可以從AgendaFilter中訪問工作記憶(或任意事實)嗎?

rule "abc" 
@uid("1234") 

    when 
     $ruleConfig : RuleConfig(uid="1234") 
     // insert the actual rule conditions 

... 

謝謝! (我知道我可以用控制事實完全解決這個問題,但是由於架構的原因,我希望儘可能避免使用實際的規則代碼,因此AgendaFilter)

回答

1

AgendaFilter是一個Pojo,你可以通過作爲參數傳遞KieSession來創建它。根據API文檔,這可以讓您訪問所有WM事實。因此,沒有必要將適當的RuleConfig作爲每個規則的附加條件。您的方法的唯一優點是您可以在匹配事實列表中隨時獲取此對象。

但是,將Map<String,RuleConfig>傳遞給AgendaFilter並不會將所有RuleConfig對象都添加到工作內存中。

稍微更復雜的方法是

rule "abc" 
@uid("1234") 
when 
    $ruleConfig : RuleConfig(uid="1234", counter > 0) 
    // ... 

與計數器被遞減,每個規則觸發 - 不一定每個RHS但在一個集中的地方:一個 RuleRuntimeEventListener

+0

謝謝,當然! (呃,我爲什麼不自己想起那個POJO的東西:)) – Sebastian

相關問題