Drools:如何声明和分配全局
Drools: How to Declare and Assign Global
我想在 drools 规则文件 (mvel) 中声明一个全局变量。这是因为此全局变量在所有规则中用作另一个函数的参数。我可以在每次调用该函数时轻松地显式传递此字符串,但是如果字符串发生变化,这会变得很困难。
我想我可以做一个:
global String someStr = "some string";
但是在编译时,我得到:
[11,31]: [ERR 107] Line 11:31 mismatched input '=' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'.
很明显,我不能这样分配。我似乎也无法在 class 中声明一个 class 和一个字符串以通过 class.
引用
所以我发现我可以做一些看起来很愚蠢的事情:
global String someStr;
rule "Initialize"
when
then
someStr = "some string";
end
这似乎可行,但是,每次此规则匹配时(总是)它都会记录以仅分配一个全局值。
有没有我想念的更好的方法???
使用全局变量有两个步骤。声明和赋值。
声明发生在规则文件中。
分配发生在 java 代码中的会话级别。
在java代码中:
List<String> list= new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
KieSession ks = kcontainer.newKieSession("test");
ks.setGlobal("glist", list);
在drl文件中:
global java.util.List glist;
现在这个 glist 全局变量的值为 "a"、"b"、"c" 可以用于 drl 文件中的所有规则。
你也可以在DRL中定义一个函数
function String getParam(String name){
return name.equals("x") ? "xValue" : "yValue";
}
.....
/// call it in you rule as below
.....
rule "my rule"
when
then
System.out.println(getParam("x"));
end
我想在 drools 规则文件 (mvel) 中声明一个全局变量。这是因为此全局变量在所有规则中用作另一个函数的参数。我可以在每次调用该函数时轻松地显式传递此字符串,但是如果字符串发生变化,这会变得很困难。
我想我可以做一个:
global String someStr = "some string";
但是在编译时,我得到:
[11,31]: [ERR 107] Line 11:31 mismatched input '=' expecting one of the following tokens: '[package, import, global, declare, function, rule, query]'.
很明显,我不能这样分配。我似乎也无法在 class 中声明一个 class 和一个字符串以通过 class.
引用所以我发现我可以做一些看起来很愚蠢的事情:
global String someStr;
rule "Initialize"
when
then
someStr = "some string";
end
这似乎可行,但是,每次此规则匹配时(总是)它都会记录以仅分配一个全局值。
有没有我想念的更好的方法???
使用全局变量有两个步骤。声明和赋值。
声明发生在规则文件中。
分配发生在 java 代码中的会话级别。
在java代码中:
List<String> list= new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
KieSession ks = kcontainer.newKieSession("test");
ks.setGlobal("glist", list);
在drl文件中:
global java.util.List glist;
现在这个 glist 全局变量的值为 "a"、"b"、"c" 可以用于 drl 文件中的所有规则。
你也可以在DRL中定义一个函数
function String getParam(String name){
return name.equals("x") ? "xValue" : "yValue";
}
.....
/// call it in you rule as below
.....
rule "my rule"
when
then
System.out.println(getParam("x"));
end