Drools с использованием правил из файлов Excel

1. Обзор

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

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

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

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

 org.kie kie-ci 7.1.0.Beta2   org.drools drools-decisiontables 7.1.0.Beta2 

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

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

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

  • Индивидуальным клиентам с возрастом более 3 лет скидка 15%.
  • Индивидуальным клиентам с возрастом менее 3 лет скидка 5%.
  • Всем бизнес-клиентам скидка 20%

3.1. Файл Excel

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

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

  • RuleSet - указывает начало таблицы решений
  • Импорт - классы Java, используемые в правилах
  • RuleTable - указывает начало набора правил
  • Имя - Название правила
  • CONDITION - фрагмент кода условия, которое нужно проверить по входным данным. Правило должно содержать хотя бы одно условие
  • ДЕЙСТВИЕ - фрагмент кода действия, выполняемого при соблюдении условий правила. Правило должно содержать хотя бы одно действие. В этом примере мы вызываем setDiscount для объекта Customer.

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

3.2. Клиентов класса

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

Класс 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 обеспечивает доступ ко всем средствам сборки и времени выполнения Kie . Он предоставляет несколько фабрик, услуг и вспомогательных методов. Итак, сначала возьмем экземпляр 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 ( любой созданный 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 преобразует таблицу решений в DRL. Из-за этого работать с ошибками и опечатками в файле Excel может быть сложно. Часто ошибки относятся к содержанию ДХО. Поэтому для устранения неполадок помогает распечатать и проанализировать DRL:

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 для чтения и запуска правил. Наконец, мы написали тестовые примеры для проверки результатов.

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