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
— указывает начало набора правилИмя
— название правила.УСЛОВИЕ
– фрагмент кода условия, которое будет проверяться на входных данных. Правило должно содержать хотя бы одно условиеДЕЙСТВИЕ
— фрагмент кода действия, которое будет выполнено, если выполняются условия правила. Правило должно содержать хотя бы одно действие. В примере мы вызываемsetDiscount
для объектаCustomer .
Кроме того, мы использовали класс Customer в файле Excel.
Итак, давайте создадим это сейчас.
3.2. Класс клиентов
_
Как видно из УСЛОВИЙ и ДЕЙСТВИЙ на листе Excel, мы используем объект класса 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/foreach/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
с этим 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/foreach/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. Таким образом, для устранения неполадок помогает распечатать и проанализировать DRL:
Resource dt
= ResourceFactory
.newClassPathResource("com/foreach/drools/rules/Discount.xls",
getClass());
DecisionTableProviderImpl decisionTableProvider
= new DecisionTableProviderImpl();
String drl = decisionTableProvider.loadFromResource(dt, null);
8. Заключение
В этой статье мы рассмотрели быстрый пример использования Drools для управления бизнес-правилами в электронной таблице Excel. Мы рассмотрели структуру и минимальный набор ключевых слов, используемых при определении правил в файле Excel. Затем мы использовали компоненты Kie для чтения и запуска правил. Наконец, мы написали тестовые примеры для проверки результатов.
Как всегда, пример, использованный в этой статье, можно найти в проекте Github .