情况很容易。我创建了一个规则文件:
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
Run Code Online (Sandbox Code Playgroud)
在触发规则之前,我添加了带有有效coreName和全局变量的Section对象:
public void fireInserted(Section section1) {
kstateful.insert(section1);
kstateful.setGlobal("sectionName", new String("markudetails"));
kstateful.fireAllRules();
}
Run Code Online (Sandbox Code Playgroud)
结果是:
Section: markudetails(12)
Section Name: markudetails(12)
Mark Details: false
Run Code Online (Sandbox Code Playgroud)
问题:怎么可能?在什么时候部分为空,然后部分不为空!
全局变量不是知识库的一部分,而是将某些上下文推入规则执行的单独通道。在when子句中使用它们是不合适的。null由于规则激活与规则执行完全脱钩,因此很难找到出现这种情况的确切原因。该变量可能根本不会在when子句评估时绑定,而是在then子句执行时绑定。
总结一下:不要在when子句中使用全局变量,这不是它们的作用。
您的问题有一个简单的通用解决方案:您可以将配置对象插入知识中。该对象可以具有所需的“ sectionName”属性,然后可以在中轻松进行测试when。
顺便说一句,测试毫无意义object.equals(null)-这永远不会产生true。也没有必要使用new String("markudetails")。而是使用"markudetails"。