我有一个用例,我需要实现一个计数器,它基本上每分钟重置一次。它位于一个名为Counter的java类中,我使用两种方法:
现在addDate()用在我的“then”子句中,在那里我做了一些处理,而getSize()用在“when”子句中。重点是,如果我在最后一分钟已经进行了N次治疗,我不应该接受治疗。
规则如下:
rule "AffWebService"
when
$compteur : Counter(getSize() < max.intValue())
then
// treatment
modify ( $compteur ) { addDate() };
端
基本上它可以工作,直到列表的大小等于max(这是Drools全局)。我在getSize()函数中添加了一个记录器,每次都会触发它,所以这很好。
现在,棘手的部分。一旦列表的大小等于max,getSize()甚至不再被触发(这是有问题的,因为它是清除“旧日期”的相同功能)。这就像Drools“缓存”了值并且不执行它,可能直到我修改了计数器?
顺便说一句,我在一个规则中插入了一个事实,该规则只在会话开始时被触发一次。
任何提示都赞赏...谢谢!
答案 0 :(得分:0)
我相信你问题中的第二个要点,你说过:
getSize()清除所有超过一分钟的日期并返回新列表的大小
清楚地突出显示警告/反模式as mentioned in the Drools docs:
属性访问器不得以可能影响规则的方式更改对象的状态。请记住,规则引擎有效地在调用之间缓存其匹配结果,以使其更快。
所以我的建议是重构Counter和规则定义,以避免这个问题并遵守文档;例如,有另一个单独的规则来触发&#34;旧日期&#34;删除并修改一个计数器,或者修改一个专用计数器&#34; size&#34;字段 - 在这种单独规则的RHS中。
(我已经假定Drools版本为6.4.0.Final)