“when子句”中的函数似乎被缓存

时间:2016-06-20 16:06:32

标签: java drools rule

我有一个用例,我需要实现一个计数器,它基本上每分钟重置一次。它位于一个名为Counter的java类中,我使用两种方法:

  • addDate(),它在列表中添加日期
  • getSize()清除所有超过一分钟的日期并返回新列表的大小

现在addDate()用在我的“then”子句中,在那里我做了一些处理,而getSize()用在“when”子句中。重点是,如果我在最后一分钟已经进行了N次治疗,我不应该接受治疗。

规则如下:

rule "AffWebService"
when
    $compteur : Counter(getSize() < max.intValue())
then
    // treatment
    modify ( $compteur ) { addDate() };

基本上它可以工作,直到列表的大小等于max(这是Drools全局)。我在getSize()函数中添加了一个记录器,每次都会触发它,所以这很好。

现在,棘手的部分。一旦列表的大小等于max,getSize()甚至不再被触发(这是有问题的,因为它是清除“旧日期”的相同功能)。这就像Drools“缓存”了值并且不执行它,可能直到我修改了计数器?

顺便说一句,我在一个规则中插入了一个事实,该规则只在会话开始时被触发一次。

任何提示都赞赏...谢谢!

1 个答案:

答案 0 :(得分:0)

我相信你问题中的第二个要点,你说过:

  

getSize()清除所有超过一分钟的日期并返回新列表的大小

清楚地突出显示警告/反模式as mentioned in the Drools docs

  

属性访问器不得以可能影响规则的方式更改对象的状态。请记住,规则引擎有效地在调用之间缓存其匹配结果,以使其更快。

所以我的建议是重构Counter和规则定义,以避免这个问题并遵守文档;例如,有另一个单独的规则来触发&#34;旧日期&#34;删除并修改一个计数器,或者修改一个专用计数器&#34; size&#34;字段 - 在这种单独规则的RHS中。

(我已经假定Drools版本为6.4.0.Final)