我使用AgendaFilter来决定是否应该执行规则激活。
作为我工作记忆的一部分,我插入一个"规则配置"每条规则的事实,其中包含允许执行我的规则的频率(以及相应的计数器)。
我注意到Match.getFactHandles()
只会返回“创建此匹配”的事实。 (根据java doc)。
有没有办法访问WorkingMemory及其所有事实,或者我基本上必须声明我的"规则配置"事实上,作为我的条件的一部分?
示例:现在我做了类似这样的事情(下面),我想知道我是否可以在规则中声明$ruleConfig
这个事实,但仍然能够在我的AgendaFilter中查找它。
rule "abc"
@uid("1234")
when
$ruleConfig : RuleConfig(uid="1234")
// insert the actual rule conditions
...
谢谢! (我知道我可以完全在规则内部通过控制事实来解决这个问题,但出于体系结构的原因,我希望尽可能地将其保留在实际规则代码之外,因此使用AgendaFilter)
答案 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
。