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.