Должен ли я использовать уникальный ReleaseID в каждой KieFileSystem?

#drools #rule-engine #kie

#drools #механизм правил #kie

Вопрос:

Недавно мы начали поддерживать параллельные запросы в нашем RuleEngine. Всего 4 потока, и каждый поток обрабатывает запрос на получение или сохранение правил. Ранее мы использовали идентификатор выпуска по умолчанию и статическое постоянное исходное имя файла в KieFileSystem, и поскольку запросы обрабатывались последовательно, это не вызывало никаких проблем.

Теперь для каждого запроса я генерирую уникальный 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();
 

После этого изменения мы начали наблюдать, что использование памяти кучи начало неуклонно увеличиваться (куча установлена на уровне 2 ГБ). Я читал, что сеанс без состояния не требует явного удаления (после того, как мы вызовем execute для него).

Существует ли вероятность того, что объекты (kiefilesystem, kiemodule или kiecontainer) все еще остаются в памяти даже после GC? Могу ли я явно удалить / удалить эти объекты после выполнения правил в сеансе?

И нужно ли мне вообще иметь уникальный ReleaseID для каждой KieFileSystem / KieModule (даже если они находятся в разных потоках)?

Комментарии:

1. Интересный вопрос. Вы пытались профилировать его с помощью виртуальной машины JVisual? Дамп кучи даст вам точные доказательства того, что некоторые объекты все еще выделены. Дайте нам знать

2. Итак, недавно я наткнулся на дискуссию, в которой упоминалось, что KieContainers (например, сеансы с полным состоянием) также необходимо удалить. В настоящее время я изучаю, может ли это быть причиной проблемы здесь, поскольку я создаю контейнер в каждом запросе, но на самом деле не размещаю его явно где-либо.