布尔标志处理Drools条件

时间:2016-01-13 16:24:03

标签: drools

我们正在开发一个监控应用程序,我们在其中跟踪一组应用程序中的任务处理。 我们有一套符合我们需求的drools规则,但是我们遇到了一些性能问题(在会话中我们可能容易达到多达5万个对象)。 我们正在寻找最好的协议

这个问题是关于布尔标志的用法。 我们正在努力删除大多数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对象上进行迭代)或某些"索引"仍然习惯帮忙?

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

修改

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

declare BaseChainStep
     parent : GUID
     deprecated : boolean
end

declare App1ChainStep extends BaseChainStep
     // specific App1 fields
end

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

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

然后使用" PropagateDeprecation"将已弃用的标志传播给App1子项。规则。

引发警告的布尔标志在BaseChainStep类中声明。

1 个答案:

答案 0 :(得分:0)

虽然您偏离了传统的访问属性的方式,但这不应触发您报告的警告。我无法使用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