繁体   English   中英

禁止其他流口水规则开除

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM