«1. Обзор

Drools — это решение системы управления бизнес-правилами (BRMS). Он предоставляет механизм правил, который обрабатывает факты и выдает выходные данные в результате обработки правил и фактов. Централизация бизнес-логики позволяет быстро и дешево вносить изменения.

Он также устраняет разрыв между бизнес- и технической командами, предоставляя возможность писать правила в удобном для понимания формате.

2. Зависимости Maven

Чтобы начать работу с Drools, нам нужно сначала добавить пару зависимостей в наш pom.xml:

<dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-ci</artifactId>
    <version>7.1.0.Beta1</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-decisiontables</artifactId>
    <version>7.1.0.Beta1</version>
</dependency>

Последняя версия обеих зависимостей доступна в центральном репозитории Maven как kie-ci и drools-decisiontables.

3. Основы Drools

Мы рассмотрим основные концепции Drools:

    Факты — представляют данные, которые служат входными данными для правил. Рабочая память — хранилище с фактами, где они используются. для сопоставления с шаблоном, и его можно изменять, вставлять и удалять. Правило — представляет собой единственное правило, которое связывает факты с соответствующими действиями. Он может быть записан на языке правил Drools в файлах .drl или в виде таблицы решений в сеансе знаний электронной таблицы Excel — он содержит все ресурсы, необходимые для запуска правил; все факты вставляются в сеанс, а затем запускаются соответствующие правила. База знаний — представляет знания в экосистеме Drools, содержит информацию о ресурсах, где находятся правила, а также создает модуль сеанса знаний — A Модуль содержит несколько баз знаний, которые могут содержать разные сеансы

4. Конфигурация Java

Чтобы активировать правила для заданных данных, нам нужно создать экземпляры классов, предоставленных платформой, с информацией о расположении файлов правил и фактов: ~~ ~ 4.1. KieFileSystem

Во-первых, нам нужно установить bean-компонент KieFileSystem; это файловая система в памяти, предоставляемая фреймворком. Следующий код предоставляет контейнер для определения ресурсов Drools, таких как файлы правил, таблицы решений, программно:

Здесь RULES_PATH обозначает расположение файлов правил в файловой системе. Здесь мы читаем файлы из пути к классам, который обычно находится в /src/main/resources в случае проекта Maven.

public KieFileSystem kieFileSystem() throws IOException {
    KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
        for (Resource file : getRuleFiles()) {
            kieFileSystem.write(
              ResourceFactory.newClassPathResource(
              RULES_PATH + file.getFilename(), "UTF-8"));
        }
        return kieFileSystem;
}

4.2. KieContainer

Далее нам нужно установить KieContainer, который является заполнителем для всех KieBases для конкретного KieModule. KieContainer создается с помощью других компонентов, включая KieFileSystem, KieModule и KieBuilder.

Метод buildAll(), вызываемый в KieBuilder, создает все ресурсы и связывает их с KieBase. Он выполняется успешно только тогда, когда он может найти и проверить все файлы правил:

4.3. KieSession

public KieContainer kieContainer() throws IOException {
    KieRepository kieRepository = getKieServices().getRepository();

    kieRepository.addKieModule(new KieModule() {
        public ReleaseId getReleaseId() {
            return kieRepository.getDefaultReleaseId();
        }
    });

    KieBuilder kieBuilder = getKieServices()
      .newKieBuilder(kieFileSystem())
      .buildAll();
    

    return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}

Правила запускаются при открытии bean-компонента KieSession, который можно получить из KieContainer:

5. Реализация правил

public KieSession kieSession() throws IOException {
    return kieContainer().newKieSession();
}

Теперь, когда мы закончили с настройкой, давайте посмотрим на пару вариантов создания правил.

Мы рассмотрим реализацию правила на примере категоризации претендента на конкретную должность на основе его текущей зарплаты и количества лет опыта.

5.1. Файл правил Drools (.drl)

Проще говоря, файл правил Drools содержит все бизнес-правила.

Правило включает конструкцию «Когда-Тогда», здесь в разделе «Когда» перечислено условие, которое необходимо проверить, а в разделе «Тогда» перечислено действие, которое необходимо выполнить, если условие выполнено:

Это правило может быть запущено вставка фактов Applicant и SuggestedRole в KieSession:

package com.baeldung.drools.rules;

import com.baeldung.drools.model.Applicant;

global com.baeldung.drools.model.SuggestedRole suggestedRole;

dialect  "mvel"

rule "Suggest Manager Role"
    when
        Applicant(experienceInYears > 10)
        Applicant(currentSalary > 1000000 && currentSalary <= 
         2500000)
    then
        suggestedRole.setRole("Manager");
end

Он проверяет два условия на экземпляре Applicant, а затем на основе выполнения обоих условий устанавливает поле Role в объекте SuggestedRole.

public SuggestedRole suggestARoleForApplicant(
    Applicant applicant,SuggestedRole suggestedRole){
    KieSession kieSession = kieContainer.newKieSession();
    kieSession.insert(applicant);
    kieSession.setGlobal("suggestedRole",suggestedRole);
    kieSession.fireAllRules();
    // ...
}

Это можно проверить, выполнив тест:

В этом примере мы использовали несколько ключевых слов, предоставленных Drools. Давайте разберемся в их использовании:

@Test
public void whenCriteriaMatching_ThenSuggestManagerRole(){
    Applicant applicant = new Applicant("David", 37, 1600000.0,11);
    SuggestedRole suggestedRole = new SuggestedRole();
        
    applicantService.suggestARoleForApplicant(applicant, suggestedRole);
 
    assertEquals("Manager", suggestedRole.getRole());
}

«пакет — это имя пакета, которое мы указываем в kmodule.xml, файл правил находится внутри этого пакета. KnowledgeSession global — используется для определения переменной глобального уровня для сеанса; это можно использовать для передачи входного параметра или для получения выходного параметра для суммирования информации для диалекта сеанса — диалект определяет синтаксис, используемый в выражениях в разделе условия или разделе действия. По умолчанию используется диалект Java. Drools также поддерживают диалект mvel; это язык выражений для приложений на основе Java. Он поддерживает правило доступа к полю и методу/геттеру — это определяет блок правил с именем правила, когда — это указывает условие правила, в этом примере проверяются следующие условия: Заявитель с опытом работы более десяти лет и текущая зарплата в определенном диапазоне затем – этот блок выполняет действие, когда выполняются условия в блоке when. В этом примере роль кандидата установлена ​​как менеджер

    5.2. Таблицы решений

Таблица решений обеспечивает возможность определения правил в предварительно отформатированной электронной таблице Excel. Преимущество Drools с таблицей решений заключается в том, что их легко понять даже нетехническому человеку.

Также полезно, когда есть похожие правила, но с разными значениями, в этом случае проще добавить новую строку на лист excel, чем писать новое правило в .drl файлах. Давайте посмотрим, какова структура таблицы решений на примере применения метки к продукту в зависимости от типа продукта:

Таблица решений сгруппирована в разные разделы, верхний похож на раздел заголовка, где мы указываем набор правил ( пакет, в котором находятся файлы правил), Import (классы Java для импорта) и Notes (комментарии о назначении правил).

Центральный раздел, в котором мы определяем правила, называется RuleTable, в котором группируются правила, применяемые к одному и тому же объекту домена.

В следующей строке у нас есть столбцы типов CONDITION и ACTION. В этих столбцах мы можем получить доступ к свойствам объекта домена, упомянутым в одной строке, и их значениям в последующих строках.

Механизм запуска правил аналогичен тому, что мы видели с файлами .drl.

Мы можем проверить результат применения этих правил, выполнив тест:

6. Заключение

@Test
public void whenProductTypeElectronic_ThenLabelBarcode() {
    Product product = new Product("Microwave", "Electronic");
    product = productService.applyLabelToProduct(product);
    
    assertEquals("BarCode", product.getLabel());
}

В этой быстрой статье мы рассмотрели использование Drools в качестве механизма бизнес-правил в нашем приложении. Мы также видели несколько способов, с помощью которых мы можем писать правила на языке правил Drools, а также на простом для понимания языке электронных таблиц.

Как всегда, полный код для этой статьи доступен на GitHub.

«