Drools - Краткое руководство
Любое приложение Java уровня предприятия можно разделить на три части:
- UI - Пользовательский интерфейс (Frontend)
- Уровень обслуживания, который, в свою очередь, подключен к базе данных
- Бизнес-уровень
У нас есть несколько фреймворков, которые совместно обрабатывают UI и уровень сервиса, например Spring и Struts. Однако до появления Drools у нас не было стандартного способа обработки бизнес-логики.
Что такое Drools?
Drools - это Business Logic integration Platform (BLiP). Написан на Java. Это проект с открытым исходным кодом, поддерживаемый JBoss и Red Hat, Inc. Он расширяет и реализует алгоритм сопоставления шаблонов Rete.
С точки зрения непрофессионала, Drools - это набор инструментов, которые позволяют нам разделять и анализировать логику и данные, находящиеся в бизнес-процессах. Нам необходимо обратить внимание на два важных ключевых слова:Logic и Data.
Drools разделен на две основные части: Authoring и Runtime.
Authoring - Процесс авторинга включает создание файлов правил (файлов .DRL).
Runtime - Он включает в себя создание рабочей памяти и обработку активации.
Что такое система правил?
Drools - это механизм правил или производственная система правил, которая использует основанный на правилах подход для реализации и экспертной системы. Экспертные системы - это системы, основанные на знаниях, которые используют представление знаний для преобразования полученных знаний в базу знаний, которая может использоваться для рассуждений.
Система производственных правил - это система правил Тьюринга, в которой основное внимание уделяется представлению знаний, чтобы выразить пропозициональную логику и логику первого порядка кратким, недвусмысленным и декларативным образом.
Мозг системы производственных правил - это Inference Engineкоторый можно масштабировать до большого количества правил и фактов. Механизм вывода сопоставляет факты и данные с производственными правилами, также называемымиProductions или просто Rules - делать выводы, которые приводят к действиям.
Производственное правило - это структура из двух частей, которая использует логику первого порядка для рассуждений о представлении знаний. Механизм бизнес-правил - это программная система, которая выполняет одно или несколько бизнес-правил в рабочей среде выполнения.
Механизм правил позволяет вам определять «What to Do" и нет "How to do it. »
Что такое Правило?
Правила часть знаний часто выражается, « Когда происходит какое - то условие, то сделать некоторые задачи.»
When
<Condition is true>
Then
<Take desired Action>
Самая важная часть правила - это его whenчасть. Еслиwhen часть удовлетворена, then часть срабатывает.
rule <rule_name>
<attribute> <value>
when
<conditions>
then
<actions>
end
Соответствие шаблону
Процесс сопоставления новых или существующих фактов с производственными правилами называется сопоставлением с образцом, которое выполняется механизмом вывода. Существует ряд алгоритмов, используемых для сопоставления с образцом, в том числе -
- Linear
- Rete
- Treat
- Leaps
Drools Реализует и расширяет алгоритм Rete. Реализация Drools Rete называется ReteOO, что означает, что Drools имеет улучшенную и оптимизированную реализацию алгоритма Rete для объектно-ориентированных систем.
Преимущества системы правил
Декларативное программирование
Правила позволяют легко формулировать решения сложных проблем, а также проверять решения. В отличие от кодов, правила написаны на менее сложном языке; Бизнес-аналитики могут легко прочитать и проверить набор правил.
Логика и разделение данных
Данные находятся в объектах домена, а бизнес-логика - в правилах. В зависимости от типа проекта такое разделение может быть очень выгодным.
Скорость и масштабируемость
Алгоритм Rete OO, на котором написан Drools, - уже проверенный алгоритм. С помощью Drools ваше приложение становится очень масштабируемым. Если есть частые запросы на изменение, можно добавить новые правила, не изменяя существующие правила.
Централизация знаний
Используя Правила, вы создаете репозиторий знаний (базу знаний), который является исполняемым. Это единственная истина для деловой политики. В идеале правила должны быть настолько удобочитаемы, что могут также служить документацией.
Интеграция инструментов
Такие инструменты, как Eclipse, позволяют редактировать правила и управлять ими, а также получать немедленную обратную связь, проверку и помощь по содержанию. Также доступны инструменты аудита и отладки.
Вот предварительные условия для установки плагина 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 и перейдите в раздел справки → установить новое программное обеспечение. Нажмите Добавить, как показано на следующем снимке экрана.
После этого нажмите «Локальный», как показано здесь, и выберите «… / binaries / org.drools.updatesite».
Выберите Drools и jBPM и нажмите Далее.
Снова нажмите Далее. После этого примите условия и лицензионное соглашение и нажмите Готово.
После нажатия кнопки «Готово» начинается установка программного обеспечения -
После успешной установки вы получите следующее диалоговое окно -
Нажмите "Да". После перезапуска Eclipse перейдите в Windows → Настройки.
Вы можете увидеть Drools под вашими предпочтениями. Установка вашего плагина Drools завершена.
Drools Runtime требуется, чтобы дать редактору команду запускать программу с определенной версией Drools jar. Вы можете запускать свою программу / приложение с другой средой выполнения Drools.
Щелкните Windows → Preference → Drools → Installed Drools Runtime. Затем нажмите «Добавить», как показано на следующем снимке экрана.
После этого нажмите Create a new Drools Runtime, как показано здесь.
Введите путь до папки с двоичными файлами, в которую вы загрузили droolsjbpm-tools-distribution-5.3.0.Final.zip
Нажмите OK и укажите имя для среды выполнения Drools. Среда выполнения Drools создана.
Чтобы создать базовую программу Drools, откройте Eclipse. Перейдите в Fileb → New → Project.
Выберите проект Drools. Дайте подходящее название проекту. Например, DroolsTest.
На следующем экране вам будет предложено выбрать файлы, которые вы хотите использовать в своем первом проекте Drools.
Выберите первые два файла. Первый файл - это файл .drl (файл правил Drools), а второй файл - это класс Java для загрузки и выполнения правила HelloWorld.
Щелкните Далее → Готово.
После того, как вы нажмете «Готово», в вашем рабочем пространстве будет создан проект <DroolsTest>. Откройте класс Java, затем щелкните правой кнопкой мыши и запустите как приложение Java. Вы увидите результат, как показано здесь -
Далее мы обсудим термины, часто используемые в системе правил.
Правила
Сердце механизма правил, в котором вы указываете условия (если «а», то «б»).
Факты
Факты - это данные, на основании которых будут действовать правила. С точки зрения Java, факты - это POJO (простой старый объект Java).
Сессия
Сессия знаний в Drools - это ключевой компонент для запуска правил. Это сеанс знаний, содержащий все правила и другие ресурсы. Сеанс знаний создается из базы знаний.
Для работы механизма правил в сеанс вставляются факты, и при выполнении условия срабатывает последующее правило. Сессия бывает двух типов -
- Сессия знаний без гражданства
- Сессия с постоянным знанием
Повестка дня
Это логичная концепция. Повестка дня - это логичное место, где активации ждут, когда их запустят.
Активации
Активации thenчасть правила. Активации помещаются в повестку дня, где срабатывает соответствующее правило.
Если вы видите правило по умолчанию, записанное в проекте Hello World (Sample.drl), значит, используется множество ключевых слов, которые мы сейчас объясним.
Sample.drl
Package- Каждое правило начинается с имени пакета. Пакет действует как пространство имен для правил. Имена правил в пакете должны быть уникальными. Пакеты в правилах похожи на пакеты в Java.
Import statement- К любым фактам, к которым вы хотите применить правило, эти факты необходимо импортировать. Например, com.sample.DroolsTest.Message; в приведенном выше примере.
Rule Definition- Он состоит из названия правила, условия и следствия. Ключевые слова Drools:rule, when, then, и end. В приведенном выше примере имена правил - «Hello World» и «GoodBye». Вwhen часть - это условие как в правилах, так и в thenчасть - это следствие. В терминологии правилwhen часть также называется LHS (левая сторона), а then часть как RHS (правая часть) правила.
Теперь давайте рассмотрим термины, используемые в файле Java, используемом для загрузки Drools и выполнения правил.
База знаний
База знаний - это интерфейс, который управляет набором правил, процессов и внутренних типов. Он содержится внутри упаковкиorg.drools.KnowledgeBase. В Drools они обычно называютсяknowledge definitions или же knowledge. Определения знаний сгруппированы вknowledge packages. Определения знаний можно добавлять или удалять. Основная цель базы знаний - хранить и повторно использовать их, потому что их создание стоит дорого. База знаний предоставляет методы для создания сеансов знаний.
Сессия знаний
Сеанс знаний извлекается из базы знаний. Это основной интерфейс для взаимодействия с Drools Engine. Сеанс знаний может быть двух типов -
Сессия знаний без гражданства
Сессия с постоянным знанием
Сессия знаний без гражданства
Сеанс знаний без сохранения состояния - это сеанс без сохранения состояния, который формирует простейший вариант использования, не использующий логический вывод. Сессия без сохранения состояния может быть вызвана как функция, передавая ей некоторые данные, а затем возвращая некоторые результаты. Общие примеры сеанса без сохранения состояния включают в себя:
Validation
Имеет ли этот человек право на ипотеку?
Calculation
Рассчитайте ипотечную премию.
Routing and Filtering
Фильтруйте входящие сообщения, например электронные письма, по папкам.
Отправлять входящие сообщения в пункт назначения
Сессия с постоянным знанием
Сеансы с отслеживанием состояния более продолжительны и допускают итеративные изменения во времени. Некоторые распространенные варианты использования сеансов с отслеживанием состояния включают в себя:
Monitoring
Мониторинг и анализ фондового рынка для полуавтоматических покупок.
Diagnostics
Диагностика, медицинская диагностика
Logistics
Отслеживание посылок и обеспечение доставки
Строитель знаний
Интерфейс KnoledgeBuilder отвечает за создание пакета знаний на основе определений знаний (правил, процессов, типов). Он содержится внутри упаковкиorg.drools.builder.KnowledgeBuilder. Определения знаний могут быть в различных форматах. Если при сборке возникнут какие-либо проблемы, KnowledgeBuilder сообщит об ошибках следующими двумя способами:hasErrors и getError.
Следующая диаграмма объясняет процесс
В приведенном выше примере, поскольку мы берем простой пример сеанса знаний без сохранения состояния, мы вставили факт в сеанс, а затем вызывается метод fireAllRules (), и вы видите результат.
В случае сеанса знаний с сохранением состояния, как только правила запущены, объект сеанса знаний с сохранением состояния должен вызвать метод dispose() чтобы освободить сеанс и избежать утечек памяти.
Как вы видели .drl (файл правил) имеет собственный синтаксис, давайте рассмотрим некоторую часть синтаксиса правила в этой главе.
Условия в правилах
Правило может содержать множество условий и шаблонов, например:
- Аккаунт (баланс == 200)
- Клиент (имя == «Вивек»)
Вышеуказанные условия проверяют, равен ли остаток на счете 200 или имя клиента «Vivek».
Переменные в правилах
Имя переменной в Drools начинается с символа доллара ($).
- $ 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 - это язык выражений для приложений на основе Java. Он поддерживает доступ к полям и методам / получателям. Он основан на синтаксисе Java.
Заметность
Важность - очень важная особенность синтаксиса правил. Важность используется стратегией разрешения конфликтов, чтобы решить, какое правило применить первым. По умолчанию это главный критерий.
Мы можем использовать заметность, чтобы определить порядок стрельбы. У Salience есть один атрибут, который принимает любое выражение, возвращающее число типа int (допустимы как положительные, так и отрицательные числа). Чем выше значение, тем больше вероятность того, что правило будет активировано стратегией разрешения конфликтов.
salience ($account.balance * 5)
Значение заметности по умолчанию - 0. Мы должны помнить об этом, присваивая значения заметности только некоторым правилам.
В синтаксисе правил есть много других функций / параметров, но мы рассмотрели только важные из них.
Ключевые слова следствия правила
Ключевые слова следствия правила - это ключевые слова, используемые в «then»Часть правила.
Modify - Атрибуты факта могут быть изменены в then часть Правила.
Insert - На основе некоторого условия, если оно истинно, можно вставить новый факт в текущую сессию механизма правил.
Retract - Если в правиле выполняется определенное условие, и вы не хотите ничего предпринимать в связи с этим фактом, вы можете отозвать конкретный факт из механизма правил.
Note- Использование условной логики (операторов if) в следствии правила считается очень плохой практикой. В большинстве случаев необходимо создать новое правило.
В этой главе мы создадим проект Drools для следующей постановки проблемы -
В зависимости от города и типа продукта (сочетание города и продукта) узнайте местный налог, связанный с этим городом.
У нас будет два файла DRL для нашего проекта Drools. Два файла DRL будут обозначать два рассматриваемых города (Пуна и Нагпур) и четыре типа товаров (продукты, лекарства, часы и предметы роскоши).
Налог на лекарства в обоих городах считается нулевым.
Для продуктовых магазинов мы взяли налог в размере 2 рупий в Пуне и 1 рупий в Нагпуре.
Мы использовали одну и ту же продажную цену, чтобы продемонстрировать разные результаты. Обратите внимание, что все правила запускаются в приложении.
Вот модель для хранения каждого типа элемента -
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. Здесь мы напишем служебный класс, чтобы вы знали, какие правила запускаются или запускаются.
При таком подходе вы можете проверить, какие правила запускаются в вашем проекте 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 печатает сработавшее правило вместе с некоторой дополнительной информацией, которую вы можете передать как строку через файл DRL.
Второе правило helper печатает, было ли задействовано конкретное правило.
Мы добавили один из служебных методов в каждый файл DRL. Мы также добавили функцию импорта в файл DRL (Pune.drl). вthenВ рамках правила мы добавили вызов служебной функции. Измененный файл 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, просто дважды щелкните строку, где вы хотите создать точку останова. Помните, что вы можете создать точку останова только вthenчасть правила. Точку останова можно удалить, дважды щелкнув точку останова в редакторе DRL.
После применения точек останова вам необходимо отладить свое приложение как приложение Drools. Точки останова Drools (точки останова в файле DRL) будут работать, только если ваше приложение отлаживается как приложение Drools. Вот как вам нужно сделать то же самое -
После отладки вашего приложения как приложения Drools вы увидите элемент управления в файле DRL, как показано на следующем снимке экрана -
Вы можете видеть переменные и текущие значения объекта в этой точке отладки. Тот же самый элемент управления F6 для перехода к следующей строке и F8 для перехода к следующей точке отладки также применим и здесь. Таким образом вы можете отлаживать свое приложение Drools.
Note - Перспектива отладки в приложении Drools работает, только если диалект - MVEL до Drools 5.x.