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

In drools can I access the working memory (or arbitrary facts) from within an AgendaFilter?

我正在使用 AgendaFilter 来决定是否应该执行规则激活。 作为我工作记忆事实的一部分,我为每个规则插入一个 "rule configuration" 个事实,其中包含我的规则被允许执行的频率(以及相应的计数器)。 我注意到 Match.getFactHandles() 只有 returns 'created this match' 的事实(根据 java 文档)。 有没有办法访问 WorkingMemory 及其所有事实,或者我基本上必须声明我的 "rule configuration" 事实作为我的条件的一部分?

举例说明:现在我做了这样的事情(如下),我想知道我是否可以绕过必须在规则中声明 $ruleConfig 事实但仍然能够在我的议程过滤器。

rule "abc"
@uid("1234")

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

...

谢谢! (我知道我可以用完全在规则内的控制事实来解决这个问题,但出于架构原因,我想尽可能地将其排除在实际规则代码之外,因此使用 AgendaFilter)

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.