我有很长时间使用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”。
答案 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
重新阅读文档以查找有关字段“兼容性”限制的任何提示。没有结果