Drools 7.2:构建规则引擎(监控模式和高性能)

Drools 7.2: Building a rule engine (monitor mode and high-performance)

我正在构建一个规则引擎,它会在第一个规则匹配后退出。规则的排序是使用显着性、活动锁定(以防止重新匹配)和激活组完成的,一旦输入与第一条规则匹配就退出。

业务现在对监控模式有新的要求,引擎必须继续将输入与不处于监控模式的规则相匹配。

例如:

Object(attr1 = 1, attr2 = 2)

monitor     Rule 1: if (attr1 = 1) 
non-monitor Rule 2: if(attr = 1 and attr2= 2)
non-monitor Rule 3: ..

在这里,它应该同时匹配规则 1 和规则 2,但是必须(为了更高的性能)在匹配规则 2 时立即退出,因为它处于非监控模式。监控模式规则仅用于查看它们是否得到评估,我们出于业务目的在后端触发事件。

我目前正在使用 PackageDescBuilder、RuleDescrBuilder 等从数据库动态加载我们的规则。一个简单的 StatelessKieSession 用于评估和存储谓词中的结果作为 RHS 的一部分。

    KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId());
    StatelessKieSession kieSession = kContainer.newStatelessKieSession();
    kieSession.execute(predicate);

问:如何构建新规则?为此我应该探索哪些概念?

我在这里指的是这个文档: https://docs.jboss.org/drools/release/7.2.0.Final/drools-docs/html_single/#_rule_attributes

谢谢!

如果在规则触发应在第一个 "non-monitor" 规则之后停止之前需要触发任何数量的 "monitor" 规则,最简单的方法是调用 fireUntilHalt 并调用 halt() 在第一个 "non-monitor" 触发后的会话中。

在每个 "non-monitor" 规则的末尾放置一个 halt() 或使用监听器。

如果我对问题的理解正确,另一种解决方案可能是将监控规则和非监控规则分开在 2 个不同的议程组中。受监控的规则不会有任何 activation-group 属性,而不受监控的规则将共享相同的 activation-group(就像今天一样)。

然后,在执行规则时,请确保设置正确的 agenda-group 顺序,以便受监控的规则先于非受监控的规则触发。

在这种方法中,您还可以使用 Laue 提到的 fireUntilHalt()halt() 方法。我发现这种方法存在的问题是:

  • 如果你不使用agenda-group,你需要保证你所有的监控规则比非监控规则具有更高的显着性。
  • 您需要向 halt() 添加显着性最低的规则,以应对您的非监控规则没有任何匹配项的情况。

希望对您有所帮助,