当前位置: 首页 > 知识库问答 >
问题:

禁用另一个drools规则触发

姜钊
2023-03-14

假设我有一个议程组“daily”,它有两组drools规则集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”触发。

问题是,默认值-1/2/3总是被激发。我需要一种方法来禁用他们在自定义-1/2/3。首先,我将Custom-1/2/3中的显著性级别设置为高于Default-1/2/3。然后我尝试使用激活组。但是如果我把它们都设置为相同的激活组,六个规则中只有一个会发射,这不是我想要的。

我不允许更改。java模块,它每次都会加载所有规则。我只能更改。DRL drools规则。

谢谢你。

共有1个答案

方嘉言
2023-03-14

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

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)
 类似资料:
  • 我在同一个drl文件中有两个Drools规则,如下所示: 我的想法是用第一条规则处理所有处于临界状态的事件。然后使用第二个规则,如果任何阀门有警报,这是由“如果临界”规则设置的,发送一个短信。 你知道吗?用口水可能吗?

  • 我正在开始一个项目,流口水和口水guvnor。 我的规则部署在drools Guvnor中。我的规则引擎实例可以通过drools Guvnor公开的pkg文件访问这些规则,当您进行包发布、构建和发布时。 这一切都很好,我正在寻找的是在运行时禁用规则的解决方案。 我现在唯一的解决方案是去guvnor,归档规则,并对包含该规则的包进行构建+发布。 不是还有别的策略吗?

  • 这两个在Drools中有什么区别??意味着我们可以根据 从加载的规则库和触发规则创建WorkingMemory,如下所示: vs公司 使用会话(有状态的。无状态)触发规则,如图所示

  • 我是个流口水的新手。我创建了以下对象: 和a*。包含规则的drl文件: 在Postman中,我试图用以下主体调用规则: 我得到了以下答案: 问题是,我的值为空,而不是我期望作为响应的对象。server.log是空的,我看不出有什么问题。请你帮我。 非常感谢你。

  • 我必须在java方面这样做吗? 编辑:同时,非常欢迎针对Drools的教程/指南建议。

  • 我有一个简单的JAVA bean,有两个int字段:'a'和'b'。 更新 非常感谢你的回答。 也许我应该详细描述一下我的问题。我有一套1500条规则。每条规则: null Java代码: 解决方案2的DRL文件:我向每个规则添加了相同的激活组: