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 .