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

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

项目 {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”。

4

1 回答 1

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

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

于 2013-10-28T05:42:04.303 回答