禁用另一个drools规则从触发

use*_*188 2 java drools jbpm mvel

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

假设我有一个议程组"Daily",它有两组drools规则集A有规则"Default-1","Default-2","Default-3"set 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规则.

谢谢.

rad*_*dai 5

您可以尝试使用标记对象解决您的问题.假设你定义了一个Marker类:

public class Marker {
    String uniqueIdentifier;
    //getter and setter, etc
}
Run Code Online (Sandbox Code Playgroud)

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

when
   SomeObject($unique: someIdentifier)
   //normal conditions
then
   insert(new Marker($unique))
   //normal action
Run Code Online (Sandbox Code Playgroud)

并且默认规则仅对未触发自定义规则的对象起作用:

when
   SomeObject($unique: someIdentifier)
   not Marker(uniqueIdentifier = $unique)
   //normal conditions
then
   //normal action
Run Code Online (Sandbox Code Playgroud)

另外,为了防止泄漏,您可能需要第3(最后)组规则来清理:

when
   SomeObject($unique: someIdentifier)
   $marker : Marker(uniqueIdentifier = $unique)
then
   retract($marker)
Run Code Online (Sandbox Code Playgroud)