Drools 口水规则射击

Drools 口水规则射击,drools,rules,Drools,Rules,我有事件驱动架构。假设大约1000个事件类型,每个事件类型可以有多个侦听器。平均每场比赛2人左右。给2000个处理器。 对于每个事件处理程序,我都需要进一步评估规则,以查看是否需要该事件处理 handle(MyEvent xxx){ kisession.execute( xxx.getPayload()); // Here I want the rules that are named/identified againt my Event alone to be fired } 我可以添加

我有事件驱动架构。假设大约1000个事件类型,每个事件类型可以有多个侦听器。平均每场比赛2人左右。给2000个处理器。 对于每个事件处理程序,我都需要进一步评估规则,以查看是否需要该事件处理

handle(MyEvent xxx){
 kisession.execute( xxx.getPayload());
 // Here I want the rules that are named/identified againt my Event alone to be fired
}
我可以添加MyEvent作为特定规则LHS的一部分

但我希望对匹配进行预处理,以节省触发事件后的处理时间。 是否有更好的方法仅触发特定规则,而不是让基础引擎评估所有2000规则,以确定哪一条规则适用于有效负载事实


我可以在设计时识别特定事件处理程序的规则,并希望利用这一优势获得更好的性能。

如果您选择从规则引擎外部触发哪个规则,那么使用规则引擎绝对没有意义

Drools的目的是评估应该激活哪些规则。快速的Drools不需要在每次调用
fireAllRules
时计算2000条规则,因为您有2000条规则。当您创建知识库时,这些规则被编译成一个图表,让引擎确定哪些规则可能会触发某些匹配。每次插入、修改或收回事实时,图形都会更新。这有点像一个索引数据库表


当然,从技术上来说,你可以做到这一点。使用
fireAllRules(AgendaFilter)
方法过滤可能触发的规则。

AFAIK,底层的Rete算法应该注意这一点。它将事实库中的对象与规则中的条件相匹配,这样,只有那些可能受某些事实库更新影响的规则才能得到评估。(完成@Steve的最后一段),,这很可能会降低效率。