全球HashMap - Drools

时间:2013-10-30 22:03:18

标签: hashmap drools

有人可以告诉我是否可以在drl文件中使用全局hashMap?

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

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

3 个答案:

答案 0 :(得分:2)

我使用全局列表没有任何问题,所以我猜地图也可以正常工作。

使用setGlobal()方法启动时,可以将全局传递给工作记忆。然后在您的drl文件中,您将使用global关键字声明其使用,如此

import java.util.Map

global Map myMap

when
  // some condition
then
  myMap.put(...);
end

答案 1 :(得分:0)

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

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

然后将该变量传递给workingmemory,

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

答案 2 :(得分: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);