Введение в слюни

Введение в слюни

1. обзор

Drools - это решение системы управления бизнес-правилами (BRMS). Он предоставляет механизм правил, который обрабатывает факты и выдает результат в результате обработки правил и фактов. Централизация бизнес-логики позволяет вносить изменения быстро и дешево.

Это также устраняет разрыв между деловыми и техническими группами, предоставляя возможность для написания правил в формате, который легко понять.

2. Maven Зависимости

Чтобы начать работу с Drools, нам нужно сначала добавить пару зависимостей в нашpom.xml:


    org.kie
    kie-ci
    7.1.0.Beta1


    org.drools
    drools-decisiontables
    7.1.0.Beta1

Последняя версия обеих зависимостей доступна в центральном репозитории Maven какkie-ci иdrools-decisiontables.

3. Основы Drools

Мы рассмотрим основные понятия Drools:

  • Facts - представляет данные, которые служат входными данными для правил

  • Working Memory хранилище сFacts,, где они используются для сопоставления с образцом и могут быть изменены, вставлены и удалены

  • Rule - представляет собой одно правило, которое связываетFacts с соответствующими действиями. Его можно записать на языке правил Drools в файлах.drl или какDecision Table в электронной таблице Excel.

  • Knowledge Session - содержит все ресурсы, необходимые для правил стрельбы; всеFacts вставляются в сеанс, а затем запускаются соответствующие правила

  • Knowledge Base - представляет знания в экосистеме Drools, он содержит информацию о ресурсах, где находитсяRules, а также создаетKnowledge Session

  • *Module* *–* Модуль содержит несколько баз знаний, которые могут проводить разные сеансы

4. Конфигурация Java

Чтобы запускать правила для заданных данных, нам нужно создать экземпляры классов, предоставленных фреймворком, с информацией о расположении файлов правил иFacts:

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 обозначает расположение файлов правил в файловой системе. Здесь мы читаем файлы изclasspath, что обычно является/src/main/resources в случае проекта Maven.

4.2. KieContainerс

Затем нам нужно установитьKieContainer, который является заполнителем для всехKieBases для конкретногоKieModule. KieContainer, созданного с помощью других bean-компонентов, включая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 содержит все бизнес-правила.

A rule includes a When-Then construct, здесь в разделеWhen перечислены условия, которые необходимо проверить, а в разделеThen перечислены действия, которые необходимо предпринять, если условие выполнено:

package com.example.drools.rules;

import com.example.drools.model.Applicant;

global com.example.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, файл правил расположен внутри этого пакета

  • import - это похоже на оператор Javaimport, здесь нам нужно указать классы, которые мы вставляем вKnowledgeSession

  • global – используется для определения переменной глобального уровня для сеанса; это может использоваться для передачи входного параметра или для получения выходного параметра для обобщения информации для сеанса

  • dialect - диалект определяет синтаксис, используемый в выражениях в разделе условия или разделе действия. По умолчанию диалект является Java. Drools также поддерживают диалектmvel; это язык выражений для приложений на основе Java. Поддерживает доступ к полю и методу / получателю

  • rule - определяет блок правил с именем правила

  • when - определяет условие правила, в этом примере проверяются условияApplicant, для которыхexperienceInYears превышает десять лет, иcurrentSalary в определенном диапазоне

  • then – этот блок выполняет действие, когда выполняются условия в блокеwhen. В этом примере рольApplicant установлена ​​как Менеджер

5.2. Таблицы решений

Таблица решений предоставляет возможность определения правил в предварительно отформатированной электронной таблице Excel. Преимущество использования Drools в Таблице решений состоит в том, что их легко понять даже нетехническому человеку.

Кроме того, это полезно, когда есть похожие правила, но с разными значениями, в этом случае легче добавить новую строку на лист Excel, чем записывать новое правило в файлы.drl. Давайте посмотрим, что такое структура таблицы решений на примере нанесения этикетки на товар в зависимости от типа товара:

image

Таблица решений сгруппирована по разным разделам, верхняя часть похожа на раздел заголовка, где мы указываем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, а также упрощать понимание языка в электронных таблицах.

Как всегда, доступен полный код этой статьиover on GitHub.