java - 流口水 7.2 : Building a rule engine (monitor mode and high-performance)

标签 java drools rule-engine kie

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

业务现在对监控模式提出了新要求,其中引擎必须继续将输入与不处于监控模式的规则进行匹配。

例如:

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

谢谢!

最佳答案

如果在第一个“非监控”规则之后规则触发应该停止之前需要触发任意数量的“监控”规则,最简单的方法是调用 fireUntilHalt 并调用 在第一个“非监视器”触发后,在 session 上暂停()

在每个“非监控”规则的末尾放置一个 halt() 或使用监听器。

关于java - 流口水 7.2 : Building a rule engine (monitor mode and high-performance),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46676307/

相关文章:

java - 尝试获取 deviceID 时获取 NullPointerException

java - 当我在应用程序已经运行时进行更改后从 Android Studio 运行它时,我的应用程序崩溃了

java - SimpleDateFormat 适用于 IST 时区,但不适用于 JST 时区

java - 流口水数据库

wolfram-mathematica - 过滤掉 Mathematica 中的子列表

java - Weld(CDI 的引用实现)是否具有 Spring 中存在的任何类型的原型(prototype)范围?

jboss7.x - Drools规则错误 "Unexpected global"

java - 使用 Drools fluent API 即时更改规则的示例

java - 使用规则引擎进行验证

java - drools 决策表中的设置列表