Table of Contents
0 环境
compile "org.drools:drools-templates:7.17.0.Final"
1 调用方法
KieSession kieSession = kieSessionsPool.newKieSession();
for (Object fact: facts){
kieSession.insert(fact);
}
kieSession.fireAllRules();
// return session into pool
kieSession.dispose();
使用spark跑十几分钟以后,GC时间达到15分钟,过一会儿就OOM。
查了一圈文档发现,原来插入进去的fact不进行管理。只有在STREAM模式下才管理,默认启用CLOUD模式。
The automatic memory management for events is only performed when running the engine in STREAM mode. Check the Event Processing Mode section for details on how the STREAM mode works.
2 修改代码,自己管理插入的fact
public <T> Collection<T> invokeRules(Identity identity, Object... facts) throws Exception {
KieSessionsPool kieSessionsPool = kieCache.get(identity);
KieSession kieSession = kieSessionsPool.newKieSession();
List<FactHandle> factHandles = new ArrayList<>(facts.length);
for (Object fact: facts){
factHandles.add(kieSession.insert(fact));
}
kieSession.fireAllRules();
Class resultClass = resolveResultClass(identity);
Collection<T> results = (Collection<T>)kieSession.getObjects(obj -> resultClass.isInstance(obj));
List<T> list = handleResult(results, identity, facts);
//ATENTION: after run ten minutes, fact object accumulated too many, so delete by manually.
for (FactHandle factHandle: factHandles){
kieSession.delete(factHandle);
}
// return session into pool
kieSession.dispose();
log.info("execute identity: {}, output: {}", identity, list);
return list;
}
本文探讨了Drools规则引擎在处理大量事实(fact)时遇到的内存管理和垃圾回收(GC)问题。详细介绍了如何通过手动管理插入的事实来避免内存泄漏,以及在不同模式下(如CLOUD与STREAM模式)Drools的内存管理机制。
1090

被折叠的 条评论
为什么被折叠?



