Drools за допомогою правил з файлів Excel

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.