2013-10-25 3 views
0

JBOSS Drools에서 오랫동안 일한 경험이 있습니다. 내가 사용 함께 일하고 있어요 현재 프로젝트는 여기Drools 규칙의 문제점은 무엇입니까?

4.

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 

아이디어는 대상 개체 관련이 없습니다 작업 메모리에서 같은 항목을 철회하는 것입니다 내가 프로젝트에이 규칙의 하나입니다 Drools가 .

항목 {해당 itemId = 7305, itemTYpeId = ITEM_TYPE_A,과 targetId = -1023} 대상 {과 targetId = -1023}이 경우 규칙에

해야하지 : 나는 작업 메모리에서 이러한 개체를 사용하여 검사하고 있습니다 불.하지만 그렇지. 실험을 많이 한 후에 이상한 행동을 발견했습니다 :

규칙 "testcase1"은 실행되지 않지만 "testcase2"규칙은 실행되지 않습니다.

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

글쎄, 많은 실험을하고 난 후 여기에 내가 찾은 것이 있습니다. 버그인지 아닌지는 잘 모르겠지만, 이것은 "링크"필드 사이의 유형 차이로 인해 발생했습니다.

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 

필드 "호환성"제한에 대한 힌트를 찾을 수 : 이런 식으로 규칙을 다시 작성

문제를 해결했다. 결과 없음

관련 문제