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