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.