有关drools内存Fact更新的问题
以下是规则文件
rule "modify dt2 rule"
salience 100
enabled true
ruleflow-group "group_a"
lock-on-active true
dialect "mvel"
when
dt1 : Dt1(a == 1)
dt2 : Dt2( )
then
modify( dt2 ) {
setT("YES")
}
end
rule "b_1"
salience 96
enabled true
ruleflow-group "group_b"
lock-on-active true
dialect "mvel"
when
dt1 : Dt1( )
dt2 : Dt2( )
eval(dt2.getT()=="YES")
then
System.out.println("");
end
rule "b_2"
salience 95
enabled true
ruleflow-group "group_b"
lock-on-active true
dialect "mvel"
when
dt2 : Dt2( )
eval(dt2.getT()=="YES")
then
System.out.println("");
end
以下是对象
Dt1:
public class Dt1 implements java.io.Serializable{
private Integer a;
private Integer b;
// seter getter
}
Dt2:
public class Dt2 implements java.io.Serializable{
private String t;
// seter getter
}
drools版本 7.26.0.Final
当我输入 dt1: {"a":1} 的时候,b_2执行了,但是b_1没执行,我的理解是,当insert Fact的时候构建出来的网络,b_1 和 b_2 用的是同一个OBN,当更新的时候 都会更新的,eval也是取到最新的,奇怪的是,一个取到了,一个没取到
如果说是 lock-on-active 阻止了“modify dt2 rule”规则update事件重新渲染本条规则的网络节点信息,那
b_2 其实也是应该阻止的,但是事实上 b_2 触发了
如果把b_1换一种写法:
rule "b_2"
salience 95
enabled true
ruleflow-group "group_b"
lock-on-active true
dialect "mvel"
when
dt2 : Dt2( t:t )
eval(t=="YES")
then
System.out.println("");
end
b_2 就会触发了。这种写法像是在OBN节点下新建了一个 alpha节点 t,而 “modify dt2 rule” 更新了这个节点的指针。
也跟了好久的源代码,还是不太清这个是咋回事,希望老师拨冗指导,不吝赐教,感谢