«1. Обзор

Drools поддерживает управление бизнес-правилами в формате электронных таблиц.

В этой статье мы рассмотрим быстрый пример использования Drools для управления бизнес-правилами с помощью файла Excel.

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

Давайте добавим необходимые зависимости Drools в наше приложение:

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

Последнюю версию этих зависимостей можно найти в kie-ci и drools-decisiontables.

3. Определение правил в Excel

В нашем примере давайте определим правила для определения скидки на основе типа клиента и количества лет в качестве клиента:

    Индивидуальные клиенты со стажем более 3 лет получают скидку 15% Индивидуальные клиенты до 3 лет получают скидку 5% Все бизнес-клиенты получают скидку 20%

3.1. Файл Excel

Давайте начнем с создания нашего файла Excel в соответствии со специальной структурой и ключевыми словами, необходимыми для Drools:

В нашем простом примере мы использовали наиболее подходящий набор ключевых слов:

RuleSet â – указывает начало таблицы решений. Импорт – классы Java, используемые в правилах. RuleTable – указывает начало набора правил. Имя – имя правила. УСЛОВИЕ – фрагмент кода условия для проверяться по входным данным. Правило должно содержать как минимум одно условие ACTION — фрагмент кода действия, которое будет выполнено, если условия правила будут выполнены. Правило должно содержать хотя бы одно действие. В примере мы вызываем setDiscount для объекта Customer

    Кроме того, мы использовали класс Customer в файле Excel. Итак, давайте создадим это сейчас.

3.2. Класс Customer

Как видно из УСЛОВИЙ и ДЕЙСТВИЙ на листе Excel, мы используем объект класса Customer для входных данных (тип и годы) и для хранения результата (скидка).

Класс Customer:

4. Создание экземпляра механизма правил Drools

public class Customer {
    private CustomerType type;

    private int years;

    private int discount;

    // Standard getters and setters

    public enum CustomerType {
        INDIVIDUAL,
        BUSINESS;
    }
}

Прежде чем мы сможем выполнить определенные нами правила, нам нужно поработать с экземпляром механизма правил Drools. Для этого мы должны использовать основные компоненты Kie.

4.1. KieServices

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

Используя KieServices, мы создадим новые экземпляры KieFileSystem, KieBuilder и KieContainer.

KieServices kieServices = KieServices.Factory.get();

4.2. KieFileSystem

KieFileSystem — это виртуальная файловая система. Добавим к нему нашу таблицу Excel:

4.3. KieBuilder

Resource dt 
  = ResourceFactory
    .newClassPathResource("com/baeldung/drools/rules/Discount.xls",
      getClass());

KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt);

Теперь создайте содержимое KieFileSystem, передав его KieBuilder:

В случае успешной сборки он создает KieModule (любой созданный Maven jar с kmodule.xml в нем является KieModule).

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

4.4. KieRepository

Фреймворк автоматически добавляет KieModule (полученный в результате сборки) в KieRepository:

4.5. KieContainer

KieRepository kieRepository = kieServices.getRepository();

Теперь можно создать новый KieContainer с этим KieModule, используя его ReleaseId. В этом случае Kie присваивает ReleaseId по умолчанию:

4.6. KieSession

ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId();
KieContainer kieContainer 
  = kieServices.newKieContainer(krDefaultReleaseId);

Теперь мы можем получить KieSession из KieContainer. Наше приложение взаимодействует с KieSession, который хранит и выполняет данные во время выполнения:

5. Выполнение правил

KieSession kieSession = kieContainer.newKieSession();

Наконец, пришло время предоставить входные данные и запустить правила:

6. Тестовые примеры

Customer customer = new Customer(CustomerType.BUSINESS, 2);
kieSession.insert(customer);

kieSession.fireAllRules();

Теперь добавим несколько тестовых случаев:

7. Устранение неполадок

public class DiscountExcelIntegrationTest {

    private KieSession kSession;

    @Before
    public void setup() {
        Resource dt 
          = ResourceFactory
            .newClassPathResource("com/baeldung/drools/rules/Discount.xls",
              getClass());
        kSession = new DroolsBeanFactory().getKieSession(dt);
    }

    @Test
    public void 
      giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount() 
        throws Exception {
        Customer customer = new Customer(CustomerType.INDIVIDUAL, 5);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 15);
    }

    @Test
    public void 
      giveIndvidualRecent_whenFireRule_thenCorrectDiscount() 
      throws Exception {
        Customer customer = new Customer(CustomerType.INDIVIDUAL, 1);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 5);
    }

    @Test
    public void 
      giveBusinessAny_whenFireRule_thenCorrectDiscount() 
        throws Exception {
        Customer customer = new Customer(CustomerType.BUSINESS, 0);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 20);
    }
}

Drools преобразует таблицу решений в DRL. Из-за этого работа с ошибками и опечатками в файле Excel может быть затруднена. Часто ошибки относятся к содержимому DRL. Поэтому для устранения неполадок полезно распечатать и проанализировать DRL:

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

Resource dt 
  = ResourceFactory
    .newClassPathResource("com/baeldung/drools/rules/Discount.xls",
      getClass());

DecisionTableProviderImpl decisionTableProvider 
  = new DecisionTableProviderImpl();
 
String drl = decisionTableProvider.loadFromResource(dt, null);

В этой статье мы рассмотрели быстрый пример использования Drools для управления бизнес-правилами в электронной таблице Excel. Мы рассмотрели структуру и минимальный набор ключевых слов, используемых при определении правил в файле Excel. Затем мы использовали компоненты Kie для чтения и запуска правил. Наконец, мы написали тестовые примеры для проверки результатов.

Как всегда, пример, использованный в этой статье, можно найти в проекте Github.

«