«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.
«