我应该在每个 KieFileSystem 中使用 Unique releaseId 吗?

问题描述

我们最近开始在我们的 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...