2013-10-25 41 views
0

我有很多與JBOSS Drools合作的經驗。 當前項目我與使用工作Drools的4Drools規則有什麼問題?

這裏是我在項目規則的一個

rule "testcase" 
    salience 300 
    when 
     $item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0) 
     not Tegret(targetId == $item.targetId) 
    then 
     retract ($item); 
end 

想法是收回從沒有關聯的目標對象工作記憶等項目。

項{=的itemId 7305,itemTYpeId = ITEM_TYPE_A,目標ID = -1023} 目標{目標ID = -1023}

在這種情況下,規則

不應: 我與這些對象在工作記憶測試它火,但它確實。 經過大量的實驗後,我發現這種奇怪的行爲:

規則「testcase2」觸發,而「testcase1」不觸發。

rule "testcase1" 
    salience 300 
    when   
     $item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0) 
     Tegret(targetId == $item.targetId) 
    then 
     ... 
end 

rule "testcase2" 
    salience 300 
    when   
     $item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0) 
     Tegret($ti:targetId) 
     eval($ti == $item.targetId) 

    then 
     ... 
end 

所以這裏怎麼了? 我在不同的程序運行中分別運行「testcase1」和「testcase2」。

+0

您是否在較新版本的Drools中測試了規則?如果是這樣,他們工作嗎?即這是一個Drools 4的錯誤? – Steve

回答

0

那麼,經過大量的實驗和擺弄之後,我發現: 我不知道它是否是bug,但是這是由於「鏈接」字段之間的類型差異而發生的。

Tagret.targetId是int原語。 Item.targetId是漫長的原始。

重寫規則這種方式解決了這個問題:

rule "testcase" 
    salience 300 
    when 
     $item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0) 
     not Tegret(targetId == ((long)$item.targetId)) 
    then 
     retract ($item); 
end 

重新讀取文件,以瞭解有關領域的「兼容性」限制任何提示。沒有結果