如何在DRL文件中定义变量并为其添加值,可以在规则之间将其用作静态资源。
我尝试使用全局关键字但是在添加时我添加了值,我将不会像在文档中提到的那样在工作内存中实现。在我的情况下,我不能从应用程序端添加它。
示例:
global java.util.List myList;
function java.util.List initMyList() {
List list = new ArrayList();
list.add(1);
return list;
}
rule "initListRule"
salience 1001
when
eval(myList == null)
then
myList = initMyList();
end
rule "checkIfListIsStillEmptyRule"
salience 1000
when
eval(myList != null)
then
System.out.println("MyList is Not null");
end
由于全局不存储在woking内存中,因此myList将始终为null,因为它不是从Application端提供的。是否可以选择定义变量并将其填入DRL?
答案 0 :(得分:2)
不会动态评估DRL全局,因此您的规则“checkIfListIsStillEmptyRule”不会触发。
你可以做到
rule "initListFact"
when
not List()
then
insert( new ArrayList() );
end
rule "checkThatThereIsAnEmptyList"
when
$list: List( size == 0 )
then
modify( $list ){ add( "something" ) }
end
如果您不需要观察全局变化,可以在具有极高显着性的规则中对其进行初始化。它将作为资源提供,但您无法根据其状态建立规则条件。
global list myList
rule "initListRule"
salience 9999999999
when
then
myList = new ArrayList();
end
您可以使用多个全局:
global List myListOne
global List myListTwo
rule "initListsRule"
salience 9999999999
when
then
myListOne = new ArrayList();
myListTwo = new ArrayList();
end
如果你需要对变化做出反应,那就无法解决事实。
declare NamedList
name: String
list: ArrayList
end
rule createListOne
when
not NamedList( name == "one" )
then
insert( new NamedList( "one", new ArrayList() ) );
end
rule "checkIfListOneIsStillEmpty"
when
$nl: NamedList( name == "one", eval( list.size() == 0 ) )
then
modify( $nl ){vgetList().add( "something" ) }
end