Слюни, используя правила из файлов Excel

1. Обзор

В этой статье мы рассмотрим быстрый пример использования 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>

Последнюю версию этих зависимостей можно найти по адресу https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.kie%22%20AND%20a%3A%22kie-ci%22 .[kie-ci]и drools-decisiontables .

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

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

  • Индивидуальные клиенты старше 3 лет получают скидку 15%

  • Индивидуальные клиенты менее 3 лет получают скидку 5%

  • Все бизнес-клиенты получают скидку 20%

3.1. Файл Excel

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

ссылка:/uploads/Drools__Excel.png%201176w[]

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

  • RuleSet - указывает начало таблицы решений

  • Import - классы Java, используемые в правилах

  • RuleTable - указывает начало набора правил

  • Name - название правила

  • CONDITION - фрагмент кода условия для проверки

входные данные. Правило должно содержать хотя бы одно условие ** ACTION - фрагмент кода действия, которое нужно предпринять, если

условия правила соблюдены. Правило должно содержать хотя бы одно действие. В этом примере мы вызываем setDiscount для объекта Customer

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

3.2. Customer Class

Как видно из условий и действия в таблице Excel, мы используем объект класса Customer для ввода данных ( type и years ) и для сохранения результата ( discount ).

Customer класс:

public class Customer {
    private CustomerType type;

    private int years;

    private int discount;

   //Standard getters and setters

    public enum CustomerType {
        INDIVIDUAL,
        BUSINESS;
    }
}

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

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

4.1. KieServices

KieServices kieServices = KieServices.Factory.get();

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

4.2. KieFileSystem

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

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

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

4.3. KieBuilder

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

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

При успешной сборке он создает _KieModule ( any Maven создал jar с файлом kmodule.xml, это KieModule_ ).

4.4. KieRepository

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

KieRepository kieRepository = kieServices.getRepository();

4.5. KieContainer

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

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

4.6. KieSession

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

KieSession kieSession = kieContainer.newKieSession();

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

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

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

kieSession.fireAllRules();

6. Тестовые случаи

Давайте теперь добавим несколько тестов:

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);
    }
}

7. Поиск проблемы

Drools преобразует таблицу решений в ссылку:/drools[DRL]. Из-за этого, работа с ошибками и опечатками в файле Excel может быть сложной Часто ошибки относятся к содержанию ДХО. Таким образом, для устранения неполадок, это помогает распечатать и проанализировать ДХО:

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

DecisionTableProviderImpl decisionTableProvider
  = new DecisionTableProviderImpl();

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

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

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

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

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