我正在开发一个需要每秒处理大量事件的项目。该项目使用以流模式运行的Drools 6.5。数据作为“事件”对象提供给引擎。
由于需要处理大量事件,Drools提供的自动内存管理显着简化了开发过程。然而,drools在这一类别中有一些模糊的文档。我需要在过去的T秒内计算具有特定条件的事件数量,并在数量超过阈值时触发规则。我目前使用滑动窗来实现这一目标。问题是,Drools在T seconds超过插入之前丢弃事件(使用@expires值)或根本不丢弃它们(如果@expires标记被删除);因此要么推断不可能,要么长期导致堆内存溢出。
有没有更好的解决方法?任何人都可以澄清推断到期的工作原理吗?难道我做错了什么? 任何帮助将不胜感激。
答案 0 :(得分:1)
经过几个小时探索Drools 6.5的文档后,我终于发现了发生了什么。我将把这些信息留在这里,以帮助其他可能遇到同样问题的人。
重要
给定事件类型的显式到期策略将覆盖该相同类型的任何推断的到期偏移量。
正如文档所述(9.8.1),显式的@expires标记会覆盖任何推断的到期偏移量,因此为了让引擎处理事件的生命周期,请不要使用此标记。
7.5.1。被动模式
使用被动模式不仅是用户负责工作内存操作,例如insert(),而且还用于规则何时评估数据并触发生成的规则实例 - 使用fireAllRules()
显然,为了使用推断的到期功能,不能使用被动执行模式。运行kSession.fireUntilHalt()以活动模式运行引擎,并启用推断的到期偏移。
TL; DR: 1.删除所有@expires标记 2.在专用线程中使用fireUntilHalt()运行引擎。