在drools中我可以从AgendaFilter中访问工作记忆(或任意事实)吗?

时间:2015-12-03 12:31:55

标签: drools

我使用AgendaFilter来决定是否应该执行规则激活。 作为我工作记忆的一部分,我插入一个"规则配置"每条规则的事实,其中包含允许执行我的规则的频率(以及相应的计数器)。 我注意到Match.getFactHandles()只会返回“创建此匹配”的事实。 (根据java doc)。 有没有办法访问WorkingMemory及其所有事实,或者我基本上必须声明我的"规则配置"事实上,作为我的条件的一部分?

示例:现在我做了类似这样的事情(下面),我想知道我是否可以在规则中声明$ruleConfig这个事实,但仍然能够在我的AgendaFilter中查找它。

rule "abc"
@uid("1234")

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

...

谢谢! (我知道我可以完全在规则内部通过控制事实来解决这个问题,但出于体系结构的原因,我希望尽可能地将其保留在实际规则代码之外,因此使用AgendaFilter)

1 个答案:

答案 0 :(得分:1)

AgendaFilter是一个Pojo,您可以将KieSession作为参数传递来创建它。根据API文档,这使您可以访问所有WM事实。因此,没有必要将适当的RuleConfig作为每个规则的额外条件。您的方法的唯一优势是您可以在匹配事实列表中随时使用此对象。

但将Map<String,RuleConfig>传递给te AgendaFilter同样简单,没有将所有RuleConfig对象添加到工作记忆中。

稍微复杂一点的方法是

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

随着每个规则触发计数器递减 - 不一定在每个RHS上,而是在中心位置:a RuleRuntimeEventListener