2016-01-13 45 views
0

我們正在開發一個監控應用程序,在這個應用程序中,我們遵循一組應用程序中的任務處理。 我們有一套符合我們需求的流水規則,但我們有一些性能問題(我們可能在會話中容易達到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警告,如何解決時,條款? 是否也評估了其他條件(對所有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類中聲明。

回答

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

+0

我剛剛在我的問題上添加了一個編輯。它可能與擴展類相關聯。 –

+0

我已根據您在DRL代碼中聲明的類插入了對象,並且沿着我在答案中聲明的規則工作得很好。 - 請不要發佈「maybes」 - 如果它不能被複制,它不能被診斷並且不能被治癒。 – laune

+0

好吧,我會重現一個簡單的測試案例和轉發。但我真的有警告標誌明確使用基類的規則(我會確認)。 –