Мы используем Drools в микросервисе, он в основном использует несколько правил, определенных пользователем через пользовательский интерфейс, и создает файл drl на основе шаблона скорости.
В этом сервисе у нас есть следующие шаги для запуска правил. это все в методе.
KieHelper kieHelper = new KieHelper();
kieHelper.setClassLoader(this.getClass().getClassLoader());
String drl = "drl";
kieHelper.addContent(drl, ResourceType.DRL );
Results res = kieHelper.verify();
KieBaseConfiguration kbConf =
KieServices.Factory.get().newKieBaseConfiguration();
kbConf.setOption( EqualityBehaviorOption.EQUALITY );
KieBase kieBase = kieHelper.build( kbConf );
//вышеуказанные шаги кэшируются для получения kiebase, а затем
KieSessionConfiguration ksConf = KnowledgeBaseFactory.newKnowledgeBase().getSessionConfiguration();
((SessionConfiguration) ksConf).setBeliefSystemType(BeliefSystemType.DEFEASIBLE);
ksConf.setProperty("type", "stateful");
KieSession kieSession = kieBase.newKieSession();
kieSession.setGlobal("rules", rules);
Collection<KiePackage> kiePackages = kieSession.getKieBase().getKiePackages();
kieSession.insert(request);
kieSession.insert(response);
try {
kieSession.fireAllRules();
}catch( ConsequenceException x ){
logger.warn( "Consequence exception", x);
}
finally {
kieSession.dispose();
}
и мы используем библиотеки ниже, пускающие слюни.
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-engine</artifactId>
<version>${drools-engine.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-mvel</artifactId>
<version>${drools-mvel.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-serialization-protobuf</artifactId>
<version>${drools-serialization-protobuf.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-xml-support</artifactId>
<version>${drools-xml-support.version}</version>
</dependency>
Теперь вопрос в том,
мы следуем правильным шагам?
мы используем правильные библиотеки?
почему он занимает так много памяти?
тайники есть, но их все равно недостаточно. память стреляет до 95% в контейнере 20 ГБ.




мы следуем правильным шагам?
KieHelper не рекомендуется для производственного использования. KieFileSystem рекомендуется. Например, «ПРОГРАММАТИЧЕСКИ СОЗДАТЬ KJAR В ПАМЯТИ» в https://blog.kie.org/2021/11/drools-basic-examples.html
мы используем правильные библиотеки?
Кажется, вы хотите использовать неисполняемую модель. Тогда вам следует использовать drools-engine-classic вместо drools-engine.
почему он занимает так много памяти?
Пожалуйста, сделайте дамп кучи (например, с помощью анализатора памяти Eclipse) и проанализируйте его. Эта статья (https://blog.kie.org/2022/09/drools-trouble-shooting-memory-issues.html) может помочь.
это гистограмма дампа кучи
первые 14 строк выше относятся к отдельному методу получения kieBase, а затем мы его кэшируем, поскольку получение kieBas происходит очень медленно. Я перечислил весь код выше, чтобы узнать, правильно ли вы это делаете, чтобы активировать правила. В частности, у меня были сомнения по поводу использования KieHelper, так как я не вижу его в документации docs.drools.org/8.29.0.Final/drools-docs/docs-website/drools/…