有人可以让我知道是否可以在 drl 文件中使用全局 hashMap 吗?
我正在尝试实现一个计数器功能来跟踪所有已处理的文档。
我想在规则文件级别声明变量(类似于java中的类变量)。
我已经毫无问题地使用了全局列表,所以我猜地图也可以工作。
当您使用setGlobal()
方法启动它时,您可以将全局传递给工作内存。然后在您的 drl 文件中,您将使用global
关键字声明其用途,如下所示
import java.util.Map
global Map myMap
when
// some condition
then
myMap.put(...);
end
请参阅下面的示例以将 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);
首先,在主程序中创建一个全局变量,
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