问题描述
我们最近开始在我们的 RuleEngine 中支持并行请求。总共 4 个线程,每个线程处理一个请求来获取或保存规则。以前,我们在 KieFileSystem 中使用默认版本 ID 和静态常量源文件名,由于请求是按顺序处理的,因此不会导致任何问题。
现在,对于每个请求,我都会生成一个唯一的 releaseId 并写入 KieFileSystem,如下所示:
String uniqueSourceFilename = generateUniqueSourceFilename(namespace);
ReleaseId releaseId = kieServices.newReleaseId(RELEASE_ID_GROUP,uniqueSourceFilename,RELEASE_ID_VERSION);
kieFileSystem.generateAndWritePomXML(releaseId);
kieFileSystem.write(kieResources.newInputStreamResource(ruleFile)
.setSourcePath(uniqueSourceFilename)
.setResourceType(ResourceType.DRL));
final KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll();
final KieContainer kContainer = kieServices.newKieContainer(releaseId);
return kContainer.newStatelessKieSession();
自此更改以来,我们开始观察到堆内存使用量开始稳步增加(堆设置为 2GB)。我读到无状态会话不需要显式处理(在我们对其调用执行之后)。
是否有可能在 GC 之后对象(kiefilesystem、kiemodule 或 kiecontainer)仍然保留在内存中?在会话中执行规则后,我可以明确删除/移除这些对象吗?
我什至需要为每个 KieFileSystem/KieModule 设置一个唯一的 releaseId(即使它们在不同的线程上)?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)