Drools 流口水引擎

Drools 流口水引擎,drools,drools-fusion,Drools,Drools Fusion,我正在做一个每秒需要处理大量事件的项目。该项目使用Drools 6.5以流模式运行。数据作为“事件”对象提供给引擎 由于需要处理大量事件,Drools提供的自动内存管理大大简化了开发过程。然而,drools在这一类中的文档有点模糊。我需要计算在过去的T秒内具有特定条件的事件的数量,如果数量超过阈值,则触发规则。我目前使用滑动窗口来实现这一点。问题是,Drools会在事件插入T秒之前丢弃事件(使用@expires值),或者根本不会丢弃事件(如果移除@expires标记);因此,从长远来看,要么使推

我正在做一个每秒需要处理大量事件的项目。该项目使用Drools 6.5以流模式运行。数据作为“事件”对象提供给引擎

由于需要处理大量事件,Drools提供的自动内存管理大大简化了开发过程。然而,drools在这一类中的文档有点模糊。我需要计算在过去的T秒内具有特定条件的事件的数量,如果数量超过阈值,则触发规则。我目前使用滑动窗口来实现这一点。问题是,Drools会在事件插入T秒之前丢弃事件(使用@expires值),或者根本不会丢弃事件(如果移除@expires标记);因此,从长远来看,要么使推理不可能,要么导致堆内存溢出

有更好的方法解决这个问题吗?有人能澄清推断过期是如何工作的吗?我做错什么了吗?
如果有任何帮助,我将不胜感激。

在浏览了Drools 6.5的文档几个小时后,我终于找到了发生的事情。我将把这些信息留在这里,以帮助其他可能有同样问题的人

重要信息

给定事件类型的显式过期策略将覆盖该类型的任何推断过期偏移量

正如文档所述(9.8.1),explicit@expires标记覆盖任何推断的过期偏移量,因此为了让引擎处理事件的生命周期,不要使用此标记

7.5.1。被动模式

在被动模式下,用户不仅负责工作内存操作,如insert(),而且还负责规则何时评估数据并触发生成的规则实例化-使用fireAllRules()

显然,为了使用推断到期特性,不能使用被动执行模式。运行kSession.firuntilhalt()以活动模式运行引擎,并启用推断的过期偏移量

TL;博士: 1.删除任何@expires标记
2.在专用线程中使用fireUntilHalt()运行引擎

为什么不使用大于t秒的@expires值?但是,如果您正在这样做,并且事件更早地消失,那么您应该报告一个bug。我不想这样做,因为应用程序非常需要内存,而且规则集是动态的和多样的,因此找到最佳的t不是一件容易的事,那么您的问题是非常容易误导的。设置一个“过期”到更少的T,并怀疑事件不能在T窗口中被评估,就像在晚上拍摄公鸡,并想知道他为什么不在早晨啼叫。这个问题有点模糊,无法提供具体的帮助,但是无论如何,你可能会发现在7.Xi上引入的帮助不使用@ ExistIs标签,Laune。我使用滑动时间窗口对过去T秒内发生的具有特定参数值的事件进行计数,如果引擎无法参与任何规则的激活,我希望引擎删除这些事件。您可能会了解到,这可能无法解决内存问题。自动确定某一事件(事实)类型的到期时间取决于允许推导该限值的所有规则的总和,该限值不是现成的。不,doc7.5.1并不意味着您的第二个tldr,也不意味着“为了使用推断的到期特征,不能使用被动执行”。当使用被动模式时,推断的过期时间也有效,如果您发现这种情况不符合预期,请将错误和复制程序提交到。我已经通过一些实验对此进行了测试。使用主动模式时,被动模式的推断过期不起作用。@laune I使用一组非常基本的规则测试了事件的过期。你是说,随着规则集变得越来越大,自动过期可能会停止工作吗?规则的数量并不是必不可少的,只是它们依赖于事件时间戳之间的关系的方式。很容易编写一个禁止自动过期的规则。