Drools动态显着

时间:2016-11-15 06:41:53

标签: drools

global Integer rank1;
global Integer rank2;


rule "Data"
salience 10
when
      req : Requests(status == "ON")
then
   drools.getWorkingMemory().setGlobal("rank1", 8); 
   drools.getWorkingMemory().setGlobal("rank2", 6);
end

 rule "1" extends "Data"
 salience 8
  when
      req1 : Requests()
  then
      System.out.print("1");
 end

 rule "2" extends "Data"
 salience 6
  when
     req2 : Requests()
  then
     System.out.print("2");
 end

这里,rank1和rank2在java代码中初始化为0。 输出为11112222。 我想要相同的输出但不是使用静态显着性,我希望它是动态的。

 rule "1" extends "Data"
  salience rank1
   .......

但代码输出为21212121。

1 个答案:

答案 0 :(得分:0)

您需要在插入事实之前设置全局变量。 Globals不会动态评估。

如果你真的需要更强大的显着性,你应该创建一个类

class Salience {
    private int rank1;
    private int rank2;
    // ... 
}

并插入具有适当值的事实,并根据需要进行更改。然后,您需要添加到根规则中的模式:

rule "Data"
when
    Salience( $rank1: rank1, $rank2: rank2 )
    Requests(...)
then

您可以在显着属性中使用$rank1$rank2

注意:几乎可以肯定,你的问题有一个解决方案,可以用逻辑表达而且没有显着性,这种用法几乎总是一个设计缺陷。