【问题标题】:Boolean flags handing in Drools conditions在 Drools 条件下处理的布尔标志
【发布时间】:2016-04-18 17:33:07
【问题描述】:

我们正在开发一个监控应用程序,在该应用程序中我们跟踪一组应用程序中任务的处理。 我们有一组符合我们需求的 drools 规则,但我们有一些性能问题(我们可能很容易在会话中拥有多达 50k 个对象)。 我们正在寻找最佳协议

这个问题是关于 bloolean 标志的使用。 我们正在努力删除大部分 org.drools.core.rule.constraint.MvelConstraint: Exception jitting: ... 警告。

我们经常对布尔标志发出这样的警告。

例如在:

rule "PropagateDeprecation"
when
    $parent:BaseChainStep( $parent.Deprecated )
    $child:BaseChainStep( $parent.Id == $child.Parent,  !$child.Deprecated )
then
    modify($child){
        setDeprecated(true)
    }
end

我们对 $parent.Deprecated 和 !$child.Deprecated 都发出警告。

我们想了解为什么在布尔标志上会有这样的警告。

我们还想知道警告对组合条件的影响。 例如在:

rule "App1_TriggerExpected"
when $chainStep:App1ChainStep(
         HasChain
         , HasParent
         , !$chainStep.Deprecated
         , Status in ("error", "closed")
         , Places != null
         , Analysis != null)
then
    ..
end

如果我们在第一个条件HasChain 上有警告,如何解决when 子句? 是否也评估其他条件(对所有 App1ChainStep 对象进行迭代)或仍然使用某些“索引”来提供帮助?

如果有问题,我们使用标志作为布尔值(而不是布尔值)来确保默认值为 false。

编辑:

问题可能与扩展类有关。在我们的用例中,我们有类似的东西:

declare BaseChainStep
     parent : GUID
     deprecated : boolean
end

declare App1ChainStep extends BaseChainStep
     // specific App1 fields
end

BaseChainStep 字段可以在规则中使用 App1ChainStep 对象或 BaseChainStep 对象进行操作。

 rule "deprecateApp1"
 when $app1:App1ChainStep( BusinessLogicCondition )
 then
      modify($app1) {
           setDeprecated(true)
      }
 end

然后使用“PropagateDeprecation”规则将弃用标志传播到 App1 子项。

导致警告的布尔标志在 BaseChainStep 类中声明。

【问题讨论】:

    标签: drools


    【解决方案1】:

    尽管您偏离了访问属性的传统方式,但这不应触发您报告的警告。我无法使用 6.3.0 重现此问题。您应该添加 (a) Drools 版本 (b) 类 BaseChainStep 的 Java 代码,使用该代码可以使用所示规则重现问题。

    这是另一种(更简单的)结合布尔属性编写规则的方式:

    rule bool1
    when
      X( big, fast )
    then
      System.out.println( "big fast X" );
    end
    

    您甚至可以使用布尔运算符:

    rule bool2
    when
      X( big && ! fast )
    then
      System.out.println( "big slow X" );
    end
    

    注意字段名称的简单使用,假设为常规命名,例如,big 用于字段,isBigsetBig 用于访问器。

    【讨论】:

    • 我刚刚对我的问题进行了编辑。它可以链接到扩展类。
    • 我已经根据您在 DRL 代码中声明的类插入了对象,并且我在回答中声明的规则工作得很好。 - 请不要发布“可能” - 如果无法复制,则无法诊断,也无法治愈。
    • 好的,我将复制一个简单的测试用例并重新发布。但我确实对明确使用基类的规则的标志发出警告(我会确认)。
    • Drools 版本可能是必不可少的。
    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 2019-05-28
    • 2020-03-22
    • 2017-01-10
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多