[英]Disabling another drools rule from firing
嗨,我想在其他一组流口水规则触发时禁止其他流口水规则触发,您将如何处理?
假设我有一个议程组“每日”,其中有两套流口水规则,规则集A具有规则“ Default-1”,“ Default-2”,“ Default-3”,集合B具有规则“ Custom-1”,“ Custom-2”,“ Custom-3”
当议程组“每日”成为焦点,并且当前事实与“定制”模式匹配时,我只希望触发“ Custom-1”和/或“ Custom-2”和/或“ Custom-3”; 否则,仅触发“ Default-1”和/或“ Default-2”和/或“ Default-3”。
问题是,始终会触发Default-1 / 2/3。 我需要一种在Custom-1 / 2/3中禁用它们的方法。 首先,我将Custom-1 / 2/3中的显着性级别设置为高于Default-1 / 2/3。 然后,我尝试使用激活组。 但是,如果我将所有它们都设置为同一个激活组,那么六个规则中只有一个会触发,那不是我想要的。
我不允许更改.java模块,该模块每次都会加载所有规则。 我只能更改.drl drools规则。
谢谢。
您可以尝试使用标记对象解决问题。 假设您定义了一个Marker类:
public class Marker {
String uniqueIdentifier;
//getter and setter, etc
}
(drools允许您在* .drl代码中定义新类,而无需诉诸* .java)
然后使自定义组在默认组之前运行(显着性将起作用,定义流也将起作用),并通过在内存中插入新的标记事实来“标记”那些已为其触发了自定义规则的对象,如下所示:
when
SomeObject($unique: someIdentifier)
//normal conditions
then
insert(new Marker($unique))
//normal action
而默认规则中的仅对未触发自定义规则的对象起作用:
when
SomeObject($unique: someIdentifier)
not Marker(uniqueIdentifier = $unique)
//normal conditions
then
//normal action
另外,为防止泄漏,您可能需要第三(最后)条规则进行清理:
when
SomeObject($unique: someIdentifier)
$marker : Marker(uniqueIdentifier = $unique)
then
retract($marker)
Drools使用声明性议程支持这种行为。
它基本上提供了以下上下文方法:
void blockMatch(Match match);
void unblockAllMatches(Match match);
void cancelMatch(Match match);
要在规则中阻止其他规则,而阻止其他规则仍然为true
或实际上已明确取消阻止它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.