【问题标题】:Drools update nested member attributeDrools 更新嵌套成员属性
【发布时间】:2015-12-23 10:44:59
【问题描述】:

我在使用 Drools 时遇到了问题。 我尝试从嵌套成员更新属性。更新似乎有效,但when子句不考虑。

我有 2 个 Obj 对象,共享同一个 Cpt 对象。

Cpt cpt = new Cpt();

Obj obj1 = new Obj("obj1");
obj1.setComposant("R2");
obj1.counter = cpt;

Obj obj2 = new Obj("obj2");
obj2.setComposant("R2");
obj2.counter = cpt;

kSession.insert(obj2);
kSession.insert(obj1);

我的规则定义为:

rule "R2"
    when
        m : Obj(composant == "R2" && counter.value == 0)
    then
        System.out.println(m.getName() + " " + m.getCounter().getValue());
        m.getCounter().increment();
end

我期待 Obj1 匹配 when 子句,然后更新计数器的值(从 0 到 1)。所以 Obj2 不应该匹配 where 子句。 但事实上,它确实如此,即使显示如我所料:

obj1 0
obj2 1

谁能解释一下我做错了什么?

【问题讨论】:

    标签: object nested drools


    【解决方案1】:

    Drools 规则引擎对事实集更改的所有反应都需要使用右侧语言的扩展之一来通知。您需要为修改后的事实对象 f 调用 update(f),或者您可以使用 modify(f){...} 语句。

    但是...通过事实 A 的引用更改包含的对象 X 并告诉引擎事实 A 已被修改,这不会使其看到同样引用 X 的事实 B 也已更改。

    这是您应该重新考虑您的设计的地方。真的有必要通过 A 和 B 的引用共享 X 吗?或者:让 X 成为事实并更新它怎么样?后者可能意味着您必须重写规则,使 Obj 和 Cpt 之间的关系在左侧可见。但是,根据我的经验,拥有它通常比使用一些复杂的机制将更新通知从某个联合包含的对象传播到其父对象要好。

    编辑我所说的“使关系可见”的意思如下所示:

    rule "R2"
    when
        Obj(composant == "R2", $counter: counter )
        $c: Cpt( this == $counter, value == 0)
    then
        modify( $c ){ increment() }
    end
    

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多