Drools:String全局变量的奇怪行为

时间:2012-06-27 09:52:25

标签: java drools

情况很简单。我创建了一个规则文件:

package org.domain.rules;
dialect "mvel"
import eu.ohim.fsp.core.configuration.domain.xsd.Section;

global java.lang.String sectionName;

rule "rule 1"
salience 1000
when
    Section($name : nameOfTheSection)
    eval(sectionName == null)
then
    System.out.println("Section: " + $name+ "("+$name.length()+")");
    System.out.println("Section Name: " + sectionName + "("+sectionName.length()+")");
    System.out.println("Mark Details: " + sectionName.equals(null));
end

在触发规则之前,我添加了具有有效coreName和全局变量的Section对象:

public void fireInserted(Section section1) {
    kstateful.insert(section1);
    kstateful.setGlobal("sectionName", new String("markudetails"));
    kstateful.fireAllRules();
}

结果是:

Section: markudetails(12)
Section Name: markudetails(12)
Mark Details: false

问题:怎么可能?在部分为空时,在然后部分不为空!!!

1 个答案:

答案 0 :(得分:5)

全局变量不是知识库的一部分,而是将一些上下文推入规则执行的单独渠道。在when子句中使用它们是不合适的。在您的情况下,null的确切原因可能很难追踪,因为规则激活与规则执行完全分离。该变量可能不会在when子句评估时绑定,而是绑定在then子句执行时。

总结一下:不要在when子句中使用全局变量,这不是它们的用途。

您的问题有一个简单的通用解决方案:您可以在知识中插入配置对象。该对象可以包含您想要的“sectionName”属性,然后您可以在when中轻松测试该属性。

顺便说一句,测试object.equals(null)毫无意义 - 这永远不会产生true。也没有必要使用new String("markudetails")。而只使用"markudetails"