java - 禁止触发另一个流口水规则

标签 java drools jbpm mvel

您好,我想在另一组 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/

相关文章:

java - 使用 Java sdk 删除 AWS SQS 消息

java - Mockito 可以验证模拟对象上的方法调用总数吗?

java - 比较Java中的两个POJO对象并显示差异

java - 需要 Drools 项目创意

java - 如何为 jBPM 中的流程定义部署生成 sql 脚本?

java - 如何将 Websphere 6.1 服务器/运行时添加到 Eclipse?

java - Optaplanner - 运行可执行 jar 时出错,但在 eclipse 中运行正常

java - Drools 在 ant 构建期间无法解析 ObjectType

java - kie workbench 6.2.0.CR2安装程序无法启动: Unsatisfied dependencies

jbpm - JBPM、KIE Server、KIE Workbench 和 JBoss EAP 之间的关系