Drools规则有什么问题?

时间:2013-10-25 13:29:42

标签: java jboss drools rule-engine jboss-rules

我有很长时间使用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

的想法是从没有关联Target对象的工作内存中撤回这些项目。 我正在使用工作内存中的这些对象进行测试:

项目{itemId = 7305,itemTYpeId = ITEM_TYPE_A,targetId = -1023} 目标{targetId = -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”。

1 个答案:

答案 0 :(得分:0)

嗯,经过大量的实验和摆弄,我发现了: 我不知道它是否是错误,但是由于“链接”字段之间的类型差异而发生这种情况。

Tagret.targetId 是int primitive。 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

重新阅读文档以查找有关字段“兼容性”限制的任何提示。没有结果