禁用另一个drools规则从触发

时间:2013-01-11 06:33:38

标签: java drools jbpm mvel

嗨我想在另一组drools规则触发时禁用其他一些drools规则,你会怎么做?

假设我有一个议程组“每日”,它有两套流氓规则 集合A具有规则“Default-1”,“Default-2”,“Default-3” 集合B具有规则“Custom-1”,“Custom-2”,“Custom-3”

当议程组“每日”聚焦,并且当前事实与自定义模式匹配时,我想要“自定义-1”和/或“自定义-2”和/或“自定义-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规则。

谢谢。

2 个答案:

答案 0 :(得分:5)

您可以尝试使用标记对象解决问题。 假设您定义了Marker类:​​

public class Marker {
    String uniqueIdentifier;
    //getter and setter, etc
}

(drools允许您在* .drl代码中定义新类而无需使用* .java)
然后使自定义组在默认组之前运行(显着性将起作用,定义流也可以工作)并通过在内存中插入新的Marker事实来“标记”触发自定义规则的对象,如下所示:

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

另外,为了防止这种情况泄露,您可能需要第3组(最后一组)规则来清理:

when
   SomeObject($unique: someIdentifier)
   $marker : Marker(uniqueIdentifier = $unique)
then
   retract($marker)

答案 1 :(得分:1)

使用Declarative Agenda存在Drools对此类行为的支持。

它基本上提供了这种上下文方法:

void blockMatch(Match match);
void unblockAllMatches(Match match);
void cancelMatch(Match match);

要阻止规则中的其他规则,而阻止其他规则的规则仍为true,或者它们实际上已明确解除阻止。