1

我正在使用 Drools 规则服务器作为服务。我们正在使用决策表

Pre Rules Movie Object:  
actor: "unknown"  
movie: "Ghostbusters"  
rating: 9

我在 Drools 决策表中有 2 条简单的规则。第一条规则检查一个值 ( movie=="Ghostbusters"),然后设置该对象的调用setActor("Bill Murray")

第二条规则检查 Actor 是什么。我在第二条规则中有 2 行。 if Actor == "Bill Murray"它调用 的动作setRating(10)。而如果actor == "unknown" setRating(8)

第一条规则按预期触发,我可以 printLngetActor显示它是“Bill Murray”,但在第二条规则中,actor == "unknown"动作总是触发。即使在我打印的那一行中,getActor它也会打印“Bill Murray”,但它使用的是“未知”规则。

当对象从规则中返回时,它在规则中Actor = Bill Murray设置的所有值都是“正确的”,但是在评估规则时,规则似乎总是使用我在规则之外创建的原始对象。

有什么我必须添加到决策表或调用drools 规则服务器来“更新”规则表之间的对象吗?

4

2 回答 2

1

我知道自从您提出这个问题以来已经过了太多时间,但是对于其他有同样问题的人:如上所述,您应该修改对象而不是设置它。要在决策表中执行此操作,请在 RuleTable 中添加一个操作列,并在第二行中添加:

modify($className){ setActor("Bill Murray")};

将操作下的第一行保留为空白。

于 2016-07-07T13:41:05.787 回答
0

您应该使用updatemodify方法,如 Drools 文档(4.8.4.1、4.8.4.2)中所述:

rule "modify stilton"
when
    $stilton : Cheese(type == "stilton")
then
    modify( $stilton ){
        setPrice( 20 ),
        setAge( "overripe" )
    }
end

这将告诉引擎对象已更改并且将重新应用规则。

于 2011-02-26T08:20:12.013 回答