@expires vs. retract和Memory Management

时间:2017-02-10 21:28:30

标签: drools drools-fusion

1)我已经设置了一个小程序,将事件插入到以STREAM模式运行的密钥会话中。我创建了一个定时器规则,在5秒后导致halt()。使用fireUntilHalt()运行此程序并打印kieSession.getFactCount()会向我显示工作内存中仍有1个事实。

2)接下来我用@expires(4s)声明事件并再次运行程序,这次工作内存中没有任何事实按预期存在。

3)接下来,我使用时间条件创建了一个规则,在2秒内没有插入其他事件,导致规则收回事件。正如预期的那样,工作记忆中有0个事实符合预期。

4)接下来,我创建了一个规则,在第一个事件发生后1秒插入一个事件。此时只有一个被撤消,因为第二个事件在第一个事件的2秒内,但是内存管理显然缩回了第一个事件,因为它由于其时间限制而无法再匹配任何规则。同样,工作记忆中还剩下0个事实。

  

在STREAM模式下运行引擎的一个好处是,引擎可以检测事件何时由于其临时约束而无法再匹配任何规则。当发生这种情况时,引擎可以安全地从会话中删除事件而没有副作用,并释放该事件使用的任何资源。

通过这4个测试,我添加了一个eventListener(),报告插入和撤消,我还在eclipse中为审计视图设置了一个记录器。

我的问题是:为什么当事实过期或由内存管理系统处理时,eventListener()和Audit视图都不会报告。

1)在第一次测试中,显然没有收回任何内容,因此报告简明扼要。

2)第二次测试没有报告任何撤回,但是在工作记忆中留下了0个事实,尽管插入了一个事实。

3)第三次测试报告了撤回,因此报告简明扼要。

4)第四次测试报告了一次撤回,但实际上有2个事实被“撤回”,因此该报告简明扼要。

是否存在报告过期事实和内存管理操作的其他解决方案?

0 个答案:

没有答案