Drools-engine 8.29.0.Последняя проблема с памятью

Мы используем 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 ГБ.

первые 14 строк выше относятся к отдельному методу получения kieBase, а затем мы его кэшируем, поскольку получение kieBas происходит очень медленно. Я перечислил весь код выше, чтобы узнать, правильно ли вы это делаете, чтобы активировать правила. В частности, у меня были сомнения по поводу использования KieHelper, так как я не вижу его в документации docs.drools.org/8.29.0.Final/drools-docs/docs-website/drools‌​/…

Sharan 20.05.2024 06:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

мы следуем правильным шагам?

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) может помочь.

это гистограмма дампа кучи

Sharan 20.05.2024 16:10

Другие вопросы по теме