我正在构建一个规则引擎,该引擎在第一个规则匹配后退出。规则的排序是使用显着性、锁定 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/