Учебники

Слюни — Краткое руководство

Слюни — Введение

Любое приложение уровня предприятия Java можно разделить на три части:

  • UI — пользовательский интерфейс (интерфейс)
  • Уровень обслуживания, который в свою очередь связан с базой данных
  • Бизнес уровень

У нас есть ряд платформ, которые обрабатывают пользовательский интерфейс и сервисный уровень вместе, например, Spring и Struts. Тем не менее, у нас не было стандартного способа обработки бизнес-логики, пока не появился Drools.

Что такое слюни?

Drools — это платформа интеграции бизнес-логики (BLiP) . Это написано на Java. Это проект с открытым исходным кодом, поддержанный JBoss и Red Hat, Inc. Он расширяет и реализует алгоритм сопоставления с шаблоном Rete.

С точки зрения непрофессионала, Drools — это набор инструментов, которые позволяют нам отделять и рассуждать над логикой и данными, найденными в бизнес-процессах. Два важных ключевых слова, которые мы должны отметить, это логика и данные .

Drools разделен на две основные части: авторинг и среда выполнения .

  • Авторизация — процесс авторизации включает создание файлов правил (файлов .DRL).

  • Runtime — включает в себя создание рабочей памяти и обработку активации.

Авторизация — процесс авторизации включает создание файлов правил (файлов .DRL).

Runtime — включает в себя создание рабочей памяти и обработку активации.

Что такое механизм правил?

Drools — это Rule Engine или Система правил производства, которая использует подход на основе правил для реализации и Expert System. Экспертные системы — это системы, основанные на знаниях, которые используют представление знаний для обработки полученных знаний в базу знаний, которую можно использовать для рассуждений.

Система правил производства — это система Тьюринга, в которой основное внимание уделяется представлению знаний для выражения логики высказываний и логики первого порядка в краткой, однозначной и декларативной форме.

Мозг Системы Производственных Правил является Механизмом Вывода, который может масштабироваться до большого количества правил и фактов. Механизм вывода сравнивает факты и данные с правилами производства — также называемыми продукциями или просто правилами — для вывода выводов, которые приводят к действиям.

Производственное правило — это структура, состоящая из двух частей, которая использует логику первого порядка для обоснования представления знаний. Механизм бизнес-правил — это программная система, которая выполняет одно или несколько бизнес-правил в рабочей среде времени выполнения.

Механизм правил позволяет вам определять « что делать », а не « как это делать ».

Что такое правило?

Правила — это кусочки знаний, часто выражаемые как « Когда возникают какие-то условия, тогда выполняйте некоторые задачи».

When
   <Condition is true>
Then
   <Take desired Action>

Наиболее важной частью правила является его когда часть. Если часть когда удовлетворена, то эта часть срабатывает.

rule  <rule_name>
   <attribute> <value>
      
   when
      <conditions>
      
   then
      <actions>
end

Сопоставление с образцом

Процесс сопоставления новых или существующих фактов с правилами производства называется сопоставлением с образцом, который выполняется модулем вывода. Существует несколько алгоритмов, используемых для сопоставления с образцом, в том числе —

  • линейный
  • Сеть
  • Лечить
  • Leaps

Drools Реализует и расширяет алгоритм Rete. Реализация Drools Rete называется ReteOO, что означает, что Drools имеет улучшенную и оптимизированную реализацию алгоритма Rete для объектно-ориентированных систем.

Преимущества правила двигателя

Декларативное программирование

Правила позволяют легко выражать решения сложных проблем, а также проверять решения. В отличие от кодов, правила написаны на менее сложном языке; Бизнес-аналитики могут легко прочитать и проверить набор правил.

Логика и разделение данных

Данные находятся в объектах домена, а бизнес-логика — в правилах. В зависимости от типа проекта, такое разделение может быть очень выгодным.

Скорость и Масштабируемость

Алгоритм Rete OO, на котором написан Drools, уже является проверенным алгоритмом. С помощью Drools ваше приложение становится очень масштабируемым. Если есть частые запросы на изменение, можно добавлять новые правила без необходимости изменять существующие правила.

Централизация знаний

Используя Правила, вы создаете хранилище знаний (базу знаний), которое является исполняемым. Это единственная точка правды для деловой политики. В идеале, правила настолько читабельны, что они также могут служить документацией.

Интеграция инструментов

Такие инструменты, как Eclipse, предоставляют способы редактирования и управления правилами, а также немедленной обратной связи, проверки и помощи в контенте. Инструменты аудита и отладки также доступны.

Слюни — Eclipse Plugin

Вот предварительные условия для установки плагина Drools —

  • Java 1.5 (или выше) SE JDK
  • Eclipse 4.2 (или любая версия) и плагин Drools

Поскольку Drools — это BRMS (система управления бизнес-правилами), написанная на Java, мы расскажем о том, как добавить нужные плагины в этом разделе. Учитывая максимальное количество пользователей Java, использующих Eclipse, давайте посмотрим, как добавить плагин Drools 5.x.0 в Eclipse.

Шаг 1: Загрузите двоичные файлы

Загрузите двоичные файлы по следующей ссылке —

https://download.jboss.org/drools/release/5.3.0.Final/

Скачать бинарники

После завершения загрузки распакуйте файлы на жесткий диск.

Шаг 2: Установите программное обеспечение

Запустите Eclipse и перейдите на помощь → установить новое программное обеспечение. Нажмите Add, как показано на следующем скриншоте.

Доступное программное обеспечение

После этого нажмите на Local, как показано здесь, и выберите «… / binaries / org.drools.updatesite».

Добавить репозиторий

Выберите Drools и jBPM и нажмите Далее.

Слюни и JBPM

Снова нажмите Далее. После этого примите условия и лицензионное соглашение и нажмите «Готово».

Установить детали

После нажатия кнопки Готово начинается установка программного обеспечения —

Монтаж

После успешной установки вы получите следующее диалоговое окно —

Программные обновления

Нажмите на да. После перезапуска Eclipse перейдите в Windows → Настройки

Слюни Runtime

Вы можете увидеть Drools под вашими предпочтениями. Установка вашего плагина Drools завершена.

Слюни — Время выполнения

Drools Runtime требуется, чтобы дать указание редактору запускать программу с определенной версией Jar Drools. Вы можете запустить свою программу / приложение с другой средой выполнения Drools.

Нажмите Windows → Настройки → Drools → Установленная среда выполнения Drools. Затем нажмите «Добавить», как показано на следующем снимке экрана.

Установленные Drools Runtime

После этого нажмите «Создать новую среду выполнения Drools», как показано здесь.

New Drools Runtime

Введите путь до папки binaries, куда вы загрузили файл droolsjbpm-tools-distribution-5.3.0.Final.zip

Нажмите OK и укажите имя для среды выполнения Drools. Теперь среда выполнения Drools создана.

Drools — Создать программу Drools

Чтобы создать базовую программу Drools, откройте Eclipse. Перейдите в Fileb → Новый → Проект.

Базовая программа Drools

Выберите проект Drools. Дайте подходящее название для проекта. Например, DroolsTest.

На следующем экране вам будет предложено выбрать несколько файлов, которые вы хотите использовать в своем первом проекте Drools.

Новый проект Drools

Выберите первые два файла. Первый файл — это файл .drl (файл правил Drools), а второй — класс Java для загрузки и выполнения правила HelloWorld.

Нажмите Далее → Готово.

Выберите Drools Runtime

После того как вы нажмете кнопку «Готово», в вашей рабочей области будет создан проект <DroolsTest>. Откройте класс Java, затем щелкните правой кнопкой мыши и запустите как приложение Java. Вы увидите результат, как показано здесь —

Результат

Далее мы обсудим термины, часто используемые в механизме правил.

Слюни — часто используемые термины

правила

Сердце механизма правил, где вы указываете условия (если ‘a’, то ‘b’).

факты

Факты — это данные, на которые будут влиять правила. С точки зрения Java, факты — это POJO (обычный старый объект Java).

сессия

Сеанс знаний в Drools является основным компонентом для запуска правил. Это сеанс знаний, который содержит все правила и другие ресурсы. Сессия знаний создается из базы знаний.

Чтобы механизм правил работал, факты вставляются в сеанс, и при выполнении условия запускается следующее правило. Сессия бывает двух типов:

  • Сессия знаний без гражданства
  • Сессия Stateful Knowledge

Повестка дня

Это логичная концепция. Повестка дня — это логичное место, где активация ждет своего запуска.

Активации

Активации являются тогда частью правила. Активации помещаются в повестку дня, где срабатывает соответствующее правило.

Слюни — Написание правил

Если вы видите правило по умолчанию, которое записано в проекте Hello World (Sample.drl), используется много ключевых слов, которые мы сейчас расскажем.

Правило по умолчанию

Sample.drl

  • Пакет — каждое правило начинается с имени пакета. Пакет действует как пространство имен для Правил. Имена правил в пакете должны быть уникальными. Пакеты в Правилах аналогичны пакетам в Java.

  • Оператор импорта — к каким фактам вы хотите применить правило, эти факты необходимо импортировать. Например, com.sample.DroolsTest.Message; в приведенном выше примере.

  • Определение правила — оно состоит из имени правила, условия и следствия. Слюни ключевые слова являются правилом, когда, тогда и конец . В приведенном выше примере имена правил: «Hello World» и «GoodBye». Часть when является условием в правилах, а часть then является следствием. В терминологии правила, когда часть также называется LHS (левая сторона), а затем часть как RHS (правая сторона) правила.

Пакет — каждое правило начинается с имени пакета. Пакет действует как пространство имен для Правил. Имена правил в пакете должны быть уникальными. Пакеты в Правилах аналогичны пакетам в Java.

Оператор импорта — к каким фактам вы хотите применить правило, эти факты необходимо импортировать. Например, com.sample.DroolsTest.Message; в приведенном выше примере.

Определение правила — оно состоит из имени правила, условия и следствия. Слюни ключевые слова являются правилом, когда, тогда и конец . В приведенном выше примере имена правил: «Hello World» и «GoodBye». Часть when является условием в правилах, а часть then является следствием. В терминологии правила, когда часть также называется LHS (левая сторона), а затем часть как RHS (правая сторона) правила.

Теперь давайте пройдемся по терминам, используемым в файле Java, используемом для загрузки Drools и выполнения правил.

База знаний

База знаний — это интерфейс, который управляет набором правил, процессов и внутренних типов. Он содержится внутри пакета org.drools.KnowledgeBase . В Drools их обычно называют определениями знаний или знаниями . Определения знаний сгруппированы в пакеты знаний . Определения знаний могут быть добавлены или удалены. Основная цель базы знаний — хранить и повторно использовать их, потому что их создание стоит дорого. База знаний предоставляет методы для создания сеансов знаний.

Сессия знаний

Сеанс знаний извлекается из базы знаний. Это основной интерфейс для взаимодействия с Drools Engine. Сессия знаний может быть двух типов —

  • Сессия знаний без гражданства

  • Сессия Stateful Knowledge

Сессия знаний без гражданства

Сессия Stateful Knowledge

Сессия знаний без гражданства

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

  • Проверка

    • Имеет ли этот человек право на ипотеку?

Проверка

Имеет ли этот человек право на ипотеку?

  • расчет

    • Рассчитать ипотечную премию.

расчет

Рассчитать ипотечную премию.

  • Маршрутизация и фильтрация

    • Фильтруйте входящие сообщения, такие как электронные письма, в папки.

    • Отправлять входящие сообщения в пункт назначения

Маршрутизация и фильтрация

Фильтруйте входящие сообщения, такие как электронные письма, в папки.

Отправлять входящие сообщения в пункт назначения

Сессия Stateful Knowledge

Сеансы с сохранением состояния более продолжительны и допускают итерационные изменения с течением времени. Некоторые общие случаи использования для сеансов с состоянием включают:

  • мониторинг

    • Мониторинг и анализ фондового рынка для полуавтоматической покупки.

мониторинг

Мониторинг и анализ фондового рынка для полуавтоматической покупки.

  • диагностика

    • Поиск неисправностей, медицинская диагностика

диагностика

Поиск неисправностей, медицинская диагностика

  • Логистика

    • Отслеживание посылок и обеспечение доставки

Логистика

Отслеживание посылок и обеспечение доставки

Построитель знаний

Интерфейс KnoledgeBuilder отвечает за создание пакета знаний из определений знаний (правил, процессов, типов). Он содержится внутри пакета org.drools.builder.KnowledgeBuilder . Определения знаний могут быть в различных форматах. Если возникают какие-либо проблемы со сборкой , KnowledgeBuilder сообщит об ошибках с помощью этих двух методов: hasErrors и getError .

Следующая диаграмма объясняет процесс

KnoledgeBuilder

В приведенном выше примере, поскольку мы берем простой пример сеанса с информацией без сохранения состояния, мы вставляем факт в сеанс, а затем вызывается метод fireAllRules (), и вы видите вывод.

В случае сеанса с отслеживанием состояния после запуска правил объект сеанса с отслеживанием состояния должен вызвать метод dispose (), чтобы завершить сеанс и избежать утечек памяти.

Слюни — Синтаксис правила

Как вы увидели, что .drl (файл правил) имеет свой собственный синтаксис, давайте рассмотрим некоторую часть синтаксиса правил в этой главе.

Условия в Правилах

Правило может содержать много условий и шаблонов, таких как —

  • Аккаунт (баланс == 200)
  • Заказчик (имя == «Вивек»)

Приведенные выше условия проверяют, равен ли остаток на Счете 200 или имя Клиента «Vivek».

Переменные в правилах

Имя переменной в Drools начинается с символа доллара ($).

  • $ account — Account ()
  • $ account — переменная для класса Account ()

Drools может работать со всеми нативными типами Java и даже с Enum.

Комментарии в правилах

Специальные символы, # или //, могут использоваться для пометки однострочных комментариев.

Для многострочных комментариев используйте следующий формат:

/*
   Another line
   .........
   .........
*/

Глобальные переменные

Глобальные переменные — это переменные, назначенные сеансу. Они могут быть использованы по разным причинам следующим образом —

  • Для входных параметров (например, постоянных значений, которые можно настраивать от сеанса к сеансу).

  • Для выходных параметров (например, отчетность — правило может записать какое-то сообщение в глобальную переменную отчета).

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

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

Для выходных параметров (например, отчетность — правило может записать какое-то сообщение в глобальную переменную отчета).

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

Функции в правилах

Функции являются удобной функцией. Их можно использовать в условиях и последствиях. Функции представляют альтернативу классам утилит / помощников. Например,

function double calculateSquare (double value) {
   return value * value;
}

говор

Диалект определяет синтаксис, используемый в любом выражении кода, которое находится в условии или в последствии. Он включает в себя возвращаемые значения, уклонения, встроенные уклонения, предикаты, выражения значимости, последствия и т. Д. Значением по умолчанию является Java . В настоящее время Drools поддерживает еще один диалект под названием MVEL . Диалект по умолчанию может быть указан на уровне пакета следующим образом:

package org.mycompany.somePackage
dialect "mvel"

MVEL Диалект

MVEL — это язык выражений для приложений на основе Java. Он поддерживает доступ к полям и методам / получателям. Он основан на синтаксисе Java.

выпуклость

Важность — очень важная особенность синтаксиса правил. Значимость используется стратегией разрешения конфликтов, чтобы решить, какое правило применять в первую очередь. По умолчанию это основной критерий.

Мы можем использовать особенности, чтобы определить порядок правил стрельбы. У Salience есть один атрибут, который принимает любое выражение, которое возвращает число типа int (допустимы как положительные, так и отрицательные числа). Чем выше значение, тем больше вероятность того, что стратегия разрешения конфликтов будет применена к правилу.

salience ($account.balance * 5)

Значением по умолчанию является 0. Мы должны помнить об этом при назначении значений значимости только для некоторых правил.

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

Ключевые слова следствия правила

Ключевые слова следствия правила — это ключевые слова, используемые в части правила « then ».

  • Изменить — Атрибуты факта могут быть изменены в тогдашней части правила.

  • Вставить — на основании некоторого условия, если оно истинно, можно вставить новый факт в текущий сеанс механизма правил.

  • Убрать — если определенное условие является истинным в правиле, и вы не хотите действовать в отношении этого факта, вы можете убрать конкретный факт из механизма правил.

Изменить — Атрибуты факта могут быть изменены в тогдашней части правила.

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

Убрать — если определенное условие является истинным в правиле, и вы не хотите действовать в отношении этого факта, вы можете убрать конкретный факт из механизма правил.

Примечание. Считается очень плохой практикой иметь условную логику (если операторы) в рамках следствия правила. В большинстве случаев новое правило должно быть создано.

Drools — Пример программы Drools

В этой главе мы создадим проект Drools для следующей постановки задачи:

В зависимости от города и вида продукта (комбинация города и продукта) узнайте местный налог, связанный с этим городом.

У нас будет два файла DRL для нашего проекта Drools. Два файла DRL будут обозначать два рассматриваемых города (Пуна и Нагпур) и четыре типа товаров (продукты питания, лекарства, часы и предметы роскоши).

  • Налог на лекарства в обоих городах считается нулевым.

  • Для продуктов мы взяли налог в 2 рупии в Пуне и 1 рупию в Нагпуре.

Налог на лекарства в обоих городах считается нулевым.

Для продуктов мы взяли налог в 2 рупии в Пуне и 1 рупию в Нагпуре.

Мы использовали одну и ту же цену продажи, чтобы продемонстрировать разные результаты. Обратите внимание, что все правила запускаются в приложении.

Вот модель для хранения каждого itemType —

package com.sample;
import java.math.BigDecimal;
public class ItemCity {
   public enum City {
      PUNE, NAGPUR
   }
   public enum Type {
      GROCERIES, MEDICINES, WATCHES, LUXURYGOODS
   }
   private City purchaseCity;
   private BigDecimal sellPrice;
   private Type typeofItem;
   private BigDecimal localTax;
   
   public City getPurchaseCity() {
      return purchaseCity;
   }
   public void setPurchaseCity(City purchaseCity) {
      this.purchaseCity = purchaseCity;
   }
   public BigDecimal getSellPrice() {
      return sellPrice;
   }
   public void setSellPrice(BigDecimal sellPrice) {
      this.sellPrice = sellPrice;
   }
   public Type getTypeofItem() {
      return typeofItem;
   }
   public void setTypeofItem(Type typeofItem) {
      this.typeofItem = typeofItem;
   }
   public BigDecimal getLocalTax() {
      return localTax;
   }
   public void setLocalTax(BigDecimal localTax) {
      this.localTax = localTax;
   }
}

Файлы DRL

Как предлагалось ранее, мы использовали два файла DRL: Pune.drl и Nagpur.drl.

Pune.drl

Это файл DRL, который выполняет правила для города Пуна.

// created on: Dec 24, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;

// declare any global variables here
dialect "java"
rule "Pune Medicine Item"
   when
      item : ItemCity (purchaseCity == ItemCity.City.PUNE,
         typeofItem == ItemCity.Type.MEDICINES)
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

rule "Pune Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE,
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(2.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

Nagpur.drl

Это файл DRL, который выполняет правила для города Нагпур.

// created on: Dec 26, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;

// declare any global variables here
dialect "java"
rule "Nagpur Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.MEDICINES)
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

rule "Nagpur Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(1.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

Мы написали файлы DRL, основанные на городе, поскольку это дает нам возможность добавлять любое количество файлов правил позже, если добавляются новые города.

Чтобы продемонстрировать, что все правила запускаются из наших файлов правил, мы использовали два типа элементов (лекарства и продукты питания); и медицина не облагается налогом, а продукты облагаются налогом в соответствии с городом.

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

Droolstest.java

package com.sample;

import java.math.BigDecimal;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import com.sample.ItemCity.City;
import com.sample.ItemCity.Type;

/* 
   *This is a sample class to launch a rule. 
*/

public class DroolsTest {
   public static final void main(String[] args) {
      try {
         // load up the knowledge base
         KnowledgeBase kbase = readKnowledgeBase();
         StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
         
         ItemCity item1 = new ItemCity();
         item1.setPurchaseCity(City.PUNE);
         item1.setTypeofItem(Type.MEDICINES);
         item1.setSellPrice(new BigDecimal(10));
         ksession.insert(item1);
         
         ItemCity item2 = new ItemCity();
         item2.setPurchaseCity(City.PUNE);
         item2.setTypeofItem(Type.GROCERIES);
         item2.setSellPrice(new BigDecimal(10));
         ksession.insert(item2);
         
         ItemCity item3 = new ItemCity();
         item3.setPurchaseCity(City.NAGPUR);
         item3.setTypeofItem(Type.MEDICINES);
         item3.setSellPrice(new BigDecimal(10));
         ksession.insert(item3);
         
         ItemCity item4 = new ItemCity();
         item4.setPurchaseCity(City.NAGPUR);
         item4.setTypeofItem(Type.GROCERIES);
         item4.setSellPrice(new BigDecimal(10));         
         ksession.insert(item4);
         
         ksession.fireAllRules();
         
         System.out.println(item1.getPurchaseCity().toString() + " " 
            + item1.getLocalTax().intValue());
         
         System.out.println(item2.getPurchaseCity().toString() + " "
            + item2.getLocalTax().intValue());
         
         System.out.println(item3.getPurchaseCity().toString() + " "
            + item3.getLocalTax().intValue());
         
         System.out.println(item4.getPurchaseCity().toString() + " "
            + item4.getLocalTax().intValue());
                            
      } catch (Throwable t) {
         t.printStackTrace();
      }
   }
   private static KnowledgeBase readKnowledgeBase() throws Exception {
      KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
      kbuilder.add(ResourceFactory.newClassPathResource("Pune.drl"), ResourceType.DRL);
      kbuilder.add(ResourceFactory.newClassPathResource("Nagpur.drl"), ResourceType.DRL);
      KnowledgeBuilderErrors errors = kbuilder.getErrors();
      
      if (errors.size() > 0) {
         for (KnowledgeBuilderError error: errors) {
            System.err.println(error);
         }
         throw new IllegalArgumentException("Could not parse knowledge.");
      }
      KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
      kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
      return kbase;
   }
}

Если вы запустите эту программу, ее вывод будет следующим:

PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

Для Пуны и Нагпура, когда предмет является лекарством, местный налог равен нулю; тогда как, когда продукт — продуктовый продукт, налог в соответствии с городом. Дополнительные правила могут быть добавлены в файлы DRL для других продуктов. Это всего лишь пример программы.

Вызов внешней функции из файла DRL

Здесь мы продемонстрируем, как вызывать статическую функцию из файла Java в вашем файле DRL.

Прежде всего, создайте класс HelloCity.java в том же пакете com.sample .

package com.sample;

public class HelloCity {
   public static void writeHello(String name) {
      System.out.println("HELLO " + name + "!!!!!!");
   }
}

После этого добавьте оператор импорта в файл DRL, чтобы вызвать метод writeHello из файла DRL. В следующем блоке кода изменения в файле DRL Pune.drl выделены желтым цветом.

// created on: Dec 24, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
 
import com.sample.HelloCity;

//declare any global variables here
dialect "java"

rule "Pune Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.MEDICINES)
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
      HelloCity.writeHello(item.getPurchaseCity().toString());
end

rule "Pune Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(2.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
end

Запустите программу еще раз, и ее вывод будет следующим:

HELLO PUNE!!!!!!
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

Теперь разница в выводе отмечена желтым цветом, который показывает вывод статического метода в классе Java.

Преимущество вызова метода Java состоит в том, что мы можем написать любую вспомогательную / вспомогательную функцию на Java и вызвать ее из файла DRL.

Слюни — отладка

Существуют разные способы отладки проекта Drools. Здесь мы напишем класс Utility, чтобы вы знали, какие правила запускаются или запускаются.

При таком подходе вы можете проверить, какие все правила запускаются в вашем проекте Drools. Вот наш полезный класс

Utility.java

package com.sample;
import org.drools.spi.KnowledgeHelper;

public class Utility {
   public static void help(final KnowledgeHelper drools, final String message){
      System.out.println(message);
      System.out.println("\nrule triggered: " + drools.getRule().getName());
   }
   public static void helper(final KnowledgeHelper drools){
      System.out.println("\nrule triggered: " + drools.getRule().getName());
   }
}

Первый метод help печатает сработавшее правило вместе с некоторой дополнительной информацией, которую вы можете передать как String через файл DRL.

Второй помощник правила печатает, было ли вызвано конкретное правило или нет.

Мы добавили один из методов Utility в каждый файл DRL. Мы также добавили функцию импорта в файл DRL (Pune.drl). В тогдашнюю часть правила мы добавили вызов служебной функции. Модифицированный Pune.drl приведен ниже. Изменения выделены синим цветом.

Модифицированный Pune.drl

//created on: Dec 24, 2014
package droolsexample

//list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
import com.sample.HelloCity; 
import function com.sample.Utility.helper;

// declare any global variables here
dialect "java"
rule "Pune Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.MEDICINES)
   
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice()));
      HelloCity.writeHello(item.getPurchaseCity().toString()); 
      helper(drools);
end

rule "Pune Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.PUNE, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(2.0);
      item.setLocalTax(tax.multiply(item.getSellPrice())); 
      helper(drools);
end

Точно так же мы добавили другую вспомогательную функцию во второй файл DRL (Nagpur.drl). Вот модифицированный код —

Модифицированный Nagpur.drl

// created on: Dec 26, 2014
package droolsexample

// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal; 
import function com.sample.Utility.help;

//declare any global variables here
dialect "java"

rule "Nagpur Medicine Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.MEDICINES)
   
   then
      BigDecimal tax = new BigDecimal(0.0);
      item.setLocalTax(tax.multiply(item.getSellPrice())); 
      help(drools,"added info");
end

rule "Nagpur Groceries Item"
   when
      item : ItemCity(purchaseCity == ItemCity.City.NAGPUR, 
         typeofItem == ItemCity.Type.GROCERIES)
   then
      BigDecimal tax = new BigDecimal(1.0);
      item.setLocalTax(tax.multiply(item.getSellPrice())); 
      help(drools,"info");
end

Запустите программу еще раз, и она должна выдать следующий результат:

info

rule triggered: Nagpur Groceries Item
added info

rule triggered: Nagpur Medicine Item

rule triggered: Pune Groceries Item
HELLO PUNE!!!!!!

rule triggered: Pune Medicine Item
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10

Обе функции полезности вызываются, и это показывает, было ли вызвано определенное правило или нет. В приведенном выше примере вызываются все правила, но в корпоративном приложении эта служебная функция может быть действительно полезна для отладки и определения, было ли выполнено определенное правило или нет.

Использование перспективы отладки в Eclipse

Вы можете отлаживать правила во время выполнения вашего приложения Drools. Вы можете добавить точки останова в последствия ваших правил, и всякий раз, когда такая точка останова встречается во время выполнения правил, выполнение временно останавливается. Затем вы можете проверить переменные, известные на тот момент, как в Java-приложении, и использовать обычные параметры отладки, доступные в Eclipse.

Чтобы создать точку останова в вашем файле DRL, просто дважды щелкните строку, где вы хотите создать точку останова. Помните, что вы можете создать точку останова только в тогдашней части правила. Точку останова можно удалить, дважды щелкнув точку останова в редакторе DRL.

После применения точек останова вам необходимо отладить ваше приложение как приложение Drools. Точки останова Drools (точки останова в файле DRL) будут работать только в том случае, если ваше приложение отлаживается как приложение Drools. Вот как вам нужно сделать то же самое —

Слюни Применение

Как только вы отладите свое приложение как приложение Drools, вы увидите элемент управления в файле DRL, как показано на следующем снимке экрана:

Eclipse Platform

Вы можете увидеть переменные и текущие значения объекта в этой точке отладки. То же управление F6 для перехода к следующей строке и F8 для перехода к следующей точке отладки применимы и здесь. Таким образом, вы можете отлаживать приложение Drools.

Примечание . Перспектива отладки в приложении Drools работает только в том случае, если диалект MVEL до версии Drools 5.x.