Drools决策表规则不使用更新的值

时间:2011-02-24 15:13:40

标签: drools rule-engine drools-flow

我使用Drools Rules Server作为服务。我们正在使用决策表

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

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

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

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

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

我是否需要添加到决策表或调用drools规则服务器来“更新”规则表之间的对象?

2 个答案:

答案 0 :(得分:1)

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

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

将第一行保持为空白。

答案 1 :(得分:0)

您应该使用Drools docs(4.8.4.1,4.8.4.2)中描述的updatemodify方法:

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

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