有人可以告诉我是否可以在drl文件中使用全局hashMap?
我正在尝试实现计数器功能以跟踪所有处理的文档。
我想在规则文件级别声明变量(类似于java中的类变量)。
答案 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);