1. Огляд
Drools має підтримку управління бізнес-правилами у форматі електронних таблиць.
У цій статті ми побачимо короткий приклад використання Drools для управління бізнес-правилами за допомогою файлу Excel.
2. Залежності Мейвена
Давайте додамо необхідні залежності Drools у наш додаток:
org.kie kie-ci 7.1.0.Beta2 org.drools drools-decisiontables 7.1.0.Beta2
Останню версію цих залежностей можна знайти на kie-ci та drools-decimables.
3. Визначення правил у Excel
Для нашого прикладу, давайте визначимо правила для визначення знижки на основі типу клієнта та кількості років як клієнт:
- Індивідуальні клієнти, яким більше 3 років, отримують знижку 15%
- Індивідуальні клієнти, яким менше 3 років, отримують знижку 5%
- Усі бізнес-клієнти отримують знижку 20%
3.1. Файл Excel
Почнемо зі створення нашого файлу Excel відповідно до конкретної структури та ключових слів, необхідних Drools:

Для нашого простого прикладу ми використали найбільш релевантний набір ключових слів:
- RuleSet - вказує на початок таблиці рішень
- Імпорт - класи Java, що використовуються в правилах
- RuleTable - вказує на початок набору правил
- Ім'я - Назва правила
- УМОВА - фрагмент коду умови, що перевіряється щодо вхідних даних. Правило повинно містити принаймні одну умову
- ACTION - фрагмент коду дії, яку слід виконати, якщо виконуються умови правила. Правило повинно містити принаймні одну дію. У цьому прикладі ми викликаємо setDiscount на об'єкті Замовник
Крім того, ми використовували клас Customer у файлі Excel. Отже, давайте створимо це зараз.
3.2. клієнтів класу
Як видно з УМОВ та ДІЇ на аркуші Excel, ми використовуємо об’єкт класу Клієнт для вхідних даних ( тип та роки ) та для зберігання результату ( знижки ).
Клас клієнта :
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 банка з 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. Тож для усунення неполадок допомагає друк та аналіз 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.