您好,我想在另一组 drools 规则触发时禁用其他一些 drools 规则触发,您会怎么做?
假设我有一个议程组“Daily”,它有两组流口水规则 集合 A 有规则“Default-1”、“Default-2”、“Default-3” 集合 B 有规则“Custom-1”、“Custom-2”、“Custom-3”
当议程组“Daily”获得焦点并且当前事实与自定义模式相匹配时,我希望仅触发“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 规则。
谢谢。
最佳答案
您可以尝试使用标记对象解决您的问题。 假设您定义了一个标记类:
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)
关于java - 禁止触发另一个流口水规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14272944/