1. Обзор
Drools — это решение для системы управления бизнес-правилами (BRMS). Он предоставляет механизм правил, который обрабатывает факты и выдает выходные данные в результате обработки правил и фактов. Централизация бизнес-логики позволяет быстро и дешево вносить изменения.
Он также устраняет разрыв между бизнес- и технической командами, предоставляя возможность писать правила в удобном для понимания формате.
2. Зависимости Maven
Чтобы начать работу с Drools, нам нужно сначала добавить пару зависимостей в наш pom.xml
:
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>7.1.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>7.1.0.Beta1</version>
</dependency>
Последняя версия обеих зависимостей доступна в центральном репозитории Maven как kie-ci и drools-decisiontables .
3. Основы слюни
Мы рассмотрим основные концепции Drools:
Факты
— представляют данные, которые служат входными данными для правил.Рабочая память
- хранилище сфактами,
где они используются для сопоставления с образцом и могут быть изменены, вставлены и удалены.Правило
— представляет собой единственное правило, которое связываетфакты
с соответствующими действиями. Он может быть записан на языке правил Drools вфайлах .drl
или в видетаблицы решений
в электронной таблице Excel.Сеанс знаний
— он содержит все ресурсы, необходимые для правил активации; всефакты
вставляются в сеанс, а затем запускаются соответствующие правилаБаза знаний
— представляет знания в экосистеме Drools, содержит информацию о ресурсах, где находятсяправила , а также создает
сеанс знаний.
Модуль —
модуль содержит несколько баз знаний, которые могут содержать разные сеансы.
4. Конфигурация Java
Чтобы запустить правила для заданных данных, нам нужно создать экземпляры классов, предоставленных платформой, с информацией о расположении файлов правил и фактов:
4.1. KieFileSystem
Во-первых, нам нужно установить bean- компонент KieFileSystem
; это файловая система в памяти, предоставляемая фреймворком. Следующий код предоставляет контейнер для программного определения ресурсов Drools, таких как файлы правил, таблицы решений:
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(
ResourceFactory.newClassPathResource(
RULES_PATH + file.getFilename(), "UTF-8"));
}
return kieFileSystem;
}
Здесь RULES_PATH
обозначает расположение файлов правил в файловой системе. Здесь мы читаем файлы из пути к классам
, который обычно находится в /src/main/resources
в случае проекта Maven.
4.2. КиКонтейнер
Затем нам нужно установить KieContainer
, который является заполнителем для всех KieBases
для конкретного KieModule. KieContainer создается
с помощью других компонентов, включая KieFileSystem, KieModule
и KieBuilder.
Метод buildAll()
, вызываемый в KieBuilder,
создает все ресурсы и привязывает их к KieBase.
Он выполняется успешно только тогда, когда он может найти и проверить все файлы правил:
public KieContainer kieContainer() throws IOException {
KieRepository kieRepository = getKieServices().getRepository();
kieRepository.addKieModule(new KieModule() {
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
});
KieBuilder kieBuilder = getKieServices()
.newKieBuilder(kieFileSystem())
.buildAll();
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
4.3. KieSession
Правила запускаются при открытии bean-компонента KieSession
, который можно получить из KieContainer:
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
}
5. Реализация правил
Теперь, когда мы закончили с настройкой, давайте рассмотрим пару вариантов создания правил.
Мы рассмотрим реализацию правила на примере категоризации претендента на конкретную должность на основе его текущей зарплаты и количества лет опыта.
5.1. Файл правил Drools ( .drl
)
Проще говоря, файл правил Drools содержит все бизнес-правила.
Правило включает в себя конструкцию « Когда -Тогда
», здесь в разделе « Когда
» перечислено условие, которое необходимо проверить, а в разделе « Тогда
» перечислено действие, которое необходимо выполнить, если условие выполнено:
package com.foreach.drools.rules;
import com.foreach.drools.model.Applicant;
global com.foreach.drools.model.SuggestedRole suggestedRole;
dialect "mvel"
rule "Suggest Manager Role"
when
Applicant(experienceInYears > 10)
Applicant(currentSalary > 1000000 && currentSalary <=
2500000)
then
suggestedRole.setRole("Manager");
end
Это правило можно запустить, вставив факты Applicant
и SuggestedRole
в KieSession:
public SuggestedRole suggestARoleForApplicant(
Applicant applicant,SuggestedRole suggestedRole){
KieSession kieSession = kieContainer.newKieSession();
kieSession.insert(applicant);
kieSession.setGlobal("suggestedRole",suggestedRole);
kieSession.fireAllRules();
// ...
}
Он проверяет два условия на экземпляре Applicant
, а затем на основе выполнения обоих условий устанавливает поле Role
в объекте SuggestedRole .
В этом можно убедиться, выполнив тест:
@Test
public void whenCriteriaMatching_ThenSuggestManagerRole(){
Applicant applicant = new Applicant("David", 37, 1600000.0,11);
SuggestedRole suggestedRole = new SuggestedRole();
applicantService.suggestARoleForApplicant(applicant, suggestedRole);
assertEquals("Manager", suggestedRole.getRole());
}
В этом примере мы использовали несколько ключевых слов, предоставленных Drools. Давайте разберемся в их использовании:
package —
это имя пакета, которое мы указываем вkmodule.xml,
файл правил находится внутри этого пакетаимпорт
— это похоже наоператор импорта
Java , здесь нам нужно указать классы, которые мы вставляем вKnowledgeSession
global —
используется для определения переменной глобального уровня для сеанса; это можно использовать для передачи входного параметра или для получения выходного параметра для обобщения информации о сеансе.диалект
- диалект определяет синтаксис, используемый в выражениях в разделе условия или разделе действия. По умолчанию используется диалект Java. Drools также поддерживают диалектmvel
; это язык выражений для приложений на основе Java. Он поддерживает доступ к полю и методу/геттеру.правило
– это определяет блок правил с именем правилакогда
- указывает условие правила, в этом примере проверяются следующие условия:соискатель
сопытом работы
более десяти лет итекущая зарплата
в определенном диапазоне.then –
этот блок выполняет действие, когда выполняются условия вблоке when
. В этом примерероль Заявитель
установлена как Менеджер
5.2. Таблицы решений
Таблица решений обеспечивает возможность определения правил в предварительно отформатированной электронной таблице Excel. Преимущество Drools с таблицей решений заключается в том, что их легко понять даже нетехническому человеку.
Также полезно, когда есть похожие правила, но с разными значениями, в этом случае проще добавить новую строку на лист excel, чем писать новое правило в . файлы дрл
. Давайте посмотрим, какова структура таблицы решений на примере нанесения этикетки на товар в зависимости от вида товара:
Таблица решений сгруппирована в разные разделы. Верхний похож на раздел заголовка, где мы указываем RuleSet
(т.е. пакет, в котором расположены файлы правил), Import
(классы Java для импорта) и Notes
(комментарии о назначении правил).
Центральный раздел, в котором мы определяем правила, называется RuleTable
, в котором группируются правила, применяемые к одному и тому же объекту домена.
В следующей строке у нас есть типы столбцов CONDITION
и ACTION
. В этих столбцах мы можем получить доступ к свойствам объекта домена, упомянутым в одной строке, и их значениям в последующих строках.
Механизм запуска правил подобен тому, что мы видели с файлами .drl
.
Мы можем проверить результат применения этих правил, выполнив тест:
@Test
public void whenProductTypeElectronic_ThenLabelBarcode() {
Product product = new Product("Microwave", "Electronic");
product = productService.applyLabelToProduct(product);
assertEquals("BarCode", product.getLabel());
}
6. Заключение
В этой быстрой статье мы рассмотрели использование Drools в качестве механизма бизнес-правил в нашем приложении. Мы также видели несколько способов, с помощью которых мы можем писать правила на языке правил Drools, а также на простом для понимания языке электронных таблиц.
Как всегда, полный код для этой статьи доступен на GitHub .