2013-10-25 42 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 

重新读取文件,以了解有关领域的“兼容性”限制任何提示。没有结果