0

有人可以让我知道是否可以在 drl 文件中使用全局 hashMap 吗?

我正在尝试实现一个计数器功能来跟踪所有已处理的文档。

我想在规则文件级别声明变量(类似于java中的类变量)。

4

3 回答 3

2

我已经毫无问题地使用了全局列表,所以我猜地图也可以工作。

当您使用setGlobal()方法启动它时,您可以将全局传递给工作内存。然后在您的 drl 文件中,您将使用global关键字声明其用途,如下所示

import java.util.Map

global Map myMap

when
  // some condition
then
  myMap.put(...);
end
于 2013-10-31T05:47:16.393 回答
0

请参阅下面的示例以将 drl 文件中的 HashMap 用作全局:

global java.util.HashMap gifts;
rule "Platinum Customer"    
    when
        $c: Customer(customerType == CustomerType.Platinum, discountUsed == false)
    then        
        modify($c){setDiscountUsed(true)} 
        PlatinumGift pg = new PlatinumGift($c);
        insert(pg);
        ArrayList cList = (ArrayList)gifts.get(CustomerType.Platinum); //You need to do explicit type casting here; Without this, Drools compiler thinks it is an Object 
        cList.add($c);

end

Java code to Invoke the above:

Map<CustomerType, ArrayList<Customer>> gifts = new HashMap<>();
gifts.put(CustomerType.Platinum, new ArrayList<Customer>());
        gifts.put(CustomerType.Gold, new ArrayList<Customer>());
        gifts.put(CustomerType.Silver, new ArrayList<Customer>());
        kieSession.setGlobal("gifts", gifts);
于 2019-05-28T09:16:25.117 回答
0

首先,在主程序中创建一个全局变量,

public static HashMap<String , String> collectRule = new HashMap<String , String>();

然后将该变量传递到工作内存中,

WorkingMemory workingMemory = ruleBase.newStatefulSession();
workingMemory.setGlobal( "myGlobalList", collectRule );    

现在进入 .drl 文件,

    import java.util.Map
    global java.util.Map myGlobalList;
rule " Rule 1: Hello World"
    when 
        //some codition 
    then
        myGlobalList.put(key,value);
    end
于 2017-02-20T13:46:26.290 回答