#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 (например, сеансы с полным состоянием) также необходимо удалить. В настоящее время я изучаю, может ли это быть причиной проблемы здесь, поскольку я создаю контейнер в каждом запросе, но на самом деле не размещаю его явно где-либо.