Въведение в Drools

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 Central Repository като kie-ci и drools-decimables.

3. Основи на Drools

Ще разгледаме основните понятия на Drools:

  • Факти - представлява данни, които служат като вход за правила
  • Работна памет - хранилище с факти, където те се използват за съвпадение на шаблони и могат да бъдат модифицирани, вмъкнати и премахнати
  • Правило - представлява едно правило, което свързва фактите със съвпадащи действия. Тя може да бъде написана на Drools Rule Language във .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 означава местоположението на файловете с правила във файловата система. Тук четем файловете от classpath, който обикновено е / src / main / resources в случай на проект на Maven.

4.2. KieContainer

След това трябва да зададем 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

Правилата се задействат чрез отваряне на KieSession боб - който може да бъде извлечен от KieContainer:

public KieSession kieSession() throws IOException { return kieContainer().newKieSession(); }

5. Правила за прилагане

След като приключихме с настройката, нека разгледаме няколко опции за създаване на правила.

Ще проучим прилагането на правилата чрез пример за категоризиране на кандидата за определена роля, въз основа на текущата му заплата и броя на годишния му опит.

5.1. Drools Rule File ( .drl )

Просто казано, файлът с правила Drools съдържа всички бизнес правила.

Правило включва конструкция „ Кога-тогава“ , тук секцията „ Кога “ изброява условието, което трябва да бъде проверено, а раздел „ Тогава “ изброява действието, което трябва да се предприеме, ако условието е изпълнено:

package com.baeldung.drools.rules; import com.baeldung.drools.model.Applicant; global com.baeldung.drools.model.SuggestedRole suggestedRole; dialect "mvel" rule "Suggest Manager Role" when Applicant(experienceInYears > 10) Applicant(currentSalary > 1000000 && currentSalary <= 2500000) then suggestedRole.setRole("Manager"); end

Това правило може да бъде задействано чрез вмъкване на фактите за заявителя и предложената роля в KieSession:

public SuggestedRole suggestARoleForApplicant( Applicant applicant,SuggestedRole suggestedRole){ KieSession kieSession = kieContainer.newKieSession(); kieSession.insert(applicant); kieSession.setGlobal("suggestedRole",suggestedRole); kieSession.fireAllRules(); // ... }

Той тества две условия на екземпляра на заявителя и след това въз основа на изпълнението на двете условия задава полето Роля в обекта Предложена роля .

Това може да се провери чрез изпълнение на теста:

@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. Нека разберем тяхното използване:

  • пакет - това е името на пакета, което посочваме в kmodule.xml, файлът с правила се намира вътре в този пакет
  • import - това е подобно наизявлението за импортиране на Java, тук трябва да посочим класовете, които вмъкваме в KnowledgeSession
  • глобално - използва се за определяне на променлива на глобално ниво за сесия; това може да се използва за предаване на входен параметър или за получаване на изходен параметър за обобщаване на информацията за сесия
  • диалект - диалектът определя синтаксиса, използван в изразите в раздела за състоянието или раздела за действие. По подразбиране диалектът е Java. Drools също поддържат диалект mvel ; това е език за израз на приложения, базирани на Java. Той поддържа достъп до полето и метода / получателя
  • правило - това определя блок от правила с име на правило
  • когато - това определя условие на правило, в този пример условията, които се проверяват са Кандидат с опит вГодини повече от десет години и текущаЗаплата в определен диапазон
  • тогава - този блок изпълнява действието, когато са изпълнени условията вблока когато . В този примерролятана заявителя е зададена като мениджър

5.2. Таблици за решения

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

Също така е полезно, когато има подобни правила, но с различни стойности, в този случай е по-лесно да добавите нов ред на Excel лист, за разлика от писането на ново правило в. drl файлове. Нека да видим каква е структурата на таблица за вземане на решения с пример за прилагане на етикета върху продукт въз основа на типа продукт:

Таблицата за решения е групирана в различни раздели, най-горната е като заглавна секция, където ние посочваме RuleSet (т.е. пакет, в който се намират файловете с правила), Импортиране (Java класове, които се импортират) и Бележки (коментари относно целта на правилата).

Централният раздел, в който дефинираме правила, се нарича 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.