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()
添加显着性最低的规则,以应对您的非监控规则没有任何匹配项的情况。
希望对您有所帮助,
我正在构建一个规则引擎,它会在第一个规则匹配后退出。规则的排序是使用显着性、活动锁定(以防止重新匹配)和激活组完成的,一旦输入与第一条规则匹配就退出。
业务现在对监控模式有新的要求,引擎必须继续将输入与不处于监控模式的规则相匹配。
例如:
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()
添加显着性最低的规则,以应对您的非监控规则没有任何匹配项的情况。
希望对您有所帮助,