Uvod u Drools
1. Pregled
Drools je rješenje sustava upravljanja poslovnim pravilima (BRMS). Pruža mehanizam pravila koji obrađuje činjenice i daje rezultate kao rezultat obrade pravila i činjenica. Centralizacija poslovne logike omogućuje brzo i jeftino uvođenje promjena.
Također premošćuje jaz između poslovnog i tehničkog tima pružajući mogućnost pisanja pravila u formatu koji je lako razumljiv.
2. Ovisnosti Mavena
Da bismo započeli s Droolsima, prvo moramo dodati nekoliko ovisnosti u našu pom.xml:
org.kie kie-ci 7.1.0.Beta1 org.drools drools-decitables 7.1.0.Beta1
Najnovija verzija obje ovisnosti dostupna je na Maven Central Repositoryu kao kie-ci i drools-decibables.
3. Osnove Droolova
Pogledat ćemo osnovne pojmove Droolova:
- Činjenice - predstavlja podatke koji služe kao ulaz za pravila
- Radna memorija – spremište sa Činjenice, gdje se koriste za podudaranje uzoraka i mogu se mijenjati, umetati i uklanjati
- Pravilo - predstavlja jedno pravilo koje povezuje Činjenice s podudarnim radnjama. Može se napisati na jeziku Drools Rule Language u .drl datoteke ili kao Tablica odlučivanja u excel proračunskoj tablici
- Sjednica znanja - sadrži sva sredstva potrebna za pravila pucanja; svi Činjenice su umetnuti u sesiju, a zatim se aktiviraju odgovarajuća pravila
- Baza znanja - predstavlja znanje u ekosustavu Drools, ima informacije o resursima gdje Pravila su pronađeni, a također stvara Sjednica znanja
- Modul– Modul sadrži više baza znanja koje mogu držati različite sesije
4. Java konfiguracija
Da bismo aktivirali pravila na danim podacima, trebamo instancirati klase koje pružaju klase s informacijama o mjestu datoteka pravila i Činjenice:
4.1. KieFileSystem
Prvo, moramo postaviti KieFileSystem grah; ovo je sustav datoteka u memoriji koji pruža okvir. Sljedeći kod pruža spremnik da programski definira Drools resurse poput datoteka pravila, tablica odluka:
javni KieFileSystem kieFileSystem () baca IOException {KieFileSystem kieFileSystem = getKieServices (). newKieFileSystem (); za (Datoteka resursa: getRuleFiles ()) {kieFileSystem.write (ResourceFactory.newClassPathResource (RULES_PATH + file.getFilename (), "UTF-8")); } return kieFileSystem; }
Ovdje PRAVILA_PUT označava mjesto datoteka pravila u datotečnom sustavu. Ovdje čitamo datoteke iz razredna staza što je tipično / src / main / resources u slučaju Mavenova projekta.
4.2. KieContainer
Dalje, moramo postaviti KieContainer koji je rezervirano mjesto za sve KieBases posebno KieModule. KieContainer gradi se uz pomoć drugih graha uključujući KieFileSystem, KieModule, i KieBuilder.
The buildAll () metoda na koju se poziva KieBuilder gradi sve resurse i veže ih za KieBase. Izvršava se uspješno samo kad je u mogućnosti pronaći i provjeriti valjanost svih datoteka pravila:
javni KieContainer kieContainer () baca IOException {KieRepository kieRepository = getKieServices (). getRepository (); kieRepository.addKieModule (novi KieModule () {public ReleaseId getReleaseId () {return kieRepository.getDefaultReleaseId ();}}); KieBuilder kieBuilder = getKieServices () .newKieBuilder (kieFileSystem ()) .buildAll (); vrati getKieServices (). newKieContainer (kieRepository.getDefaultReleaseId ()); }
4.3. KieSession
Pravila se aktiviraju otvaranjem a KieSession grah - iz kojeg se može doći KieContainer:
javna KieSession kieSession () baca IOException {return kieContainer (). newKieSession (); }
5. Provedbena pravila
Sad kad smo završili s postavljanjem, pogledajmo nekoliko mogućnosti za stvaranje pravila.
Primjenu pravila istražit ćemo primjerom kategorizacije podnositelja zahtjeva za određenu ulogu na temelju njegove trenutne plaće i broja godina iskustva koje ima.
5.1. Drools datoteka pravila (.drl)
Jednostavno rečeno, datoteka pravila Drools sadrži sva poslovna pravila.
Pravilo uključuje a Kad-Tada konstruirati, ovdje Kada odjeljak navodi stanje koje treba provjeriti i Zatim odjeljak navodi radnju koju treba poduzeti ako je uvjet ispunjen:
paket com.baeldung.drools.rules; uvoz com.baeldung.drools.model.Aplikant; global com.baeldung.drools.model.SugngedRole prijedlogRole; dijalektno pravilo "mvel" "Predloži ulogu upravitelja" kada podnositelj zahtjeva (experienceInYears> 10) podnositelj zahtjeva (currentSalary> 1000000 && currentSalary <= 2500000) tada predložiRole.setRole ("Manager"); kraj
Ovo se pravilo može aktivirati umetanjem Podnositelj zahtjeva i Predložena uloga činjenice u KieSession:
javna SuggestedRole prijedlogARoleForApplicant (podnositelj zahtjeva, predlagateljRoleRol) {KieSession kieSession = kieContainer.newKieSession (); kieSession.insert (podnositelj zahtjeva); kieSession.setGlobal ("prijedlogRole", prijedlogRole); kieSession.fireAllRules (); // ...}
Testira dva uvjeta na Podnositelj zahtjeva instanci, a zatim na temelju ispunjenja oba uvjeta postavlja Uloga polje u Predložena uloga objekt.
To se može provjeriti izvršavanjem testa:
@Test public void whenCriteriaMatching_ThenSuggestManagerRole () {Podnositelj zahtjeva = novi podnositelj zahtjeva ("David", 37, 1600000.0,11); Predložena uloga prijedlogRole = nova Predložena uloga (); кандидатService.suggestARoleForApplicant (podnositelj zahtjeva, predloženiRole); assertEquals ("Upravitelj", predloženoRole.getRole ()); }
U ovom smo primjeru koristili nekoliko ključnih riječi koje nude Drools. Razumijemo njihovu upotrebu:
- paket - ovo je naziv paketa koji specificiramo u kmodule.xml, datoteka pravila nalazi se unutar ovog paketa
- uvoz - ovo je slično Javi uvoz , ovdje moramo navesti klase koje ubacujemo u Sjednica znanja
- globalno - ovo se koristi za definiranje varijable globalne razine za sesiju; ovo se može koristiti za prosljeđivanje ulaznog parametra ili za dobivanje izlaznog parametra za sažimanje informacija za sesiju
- dijalekt - dijalekt navodi sintaksu koja se koristi u izrazima u odjeljku stanja ili odjeljku radnje. Prema zadanim postavkama dijalekt je Java. Drools također podržavaju dijalekt mvel; to je jezik izraza za programe utemeljene na Javi. Podržava pristup polju i metodi / dobivaču
- Pravilo - ovo definira blok pravila s imenom pravila
- kada - ovo specificira uvjet pravila, u ovom primjeru uvjeti koji se provjeravaju jesu Podnositelj zahtjeva imajući iskustvo u godinama više od deset godina i Trenutna plaća u određenom rasponu
- onda - ovaj blok izvršava akciju kada su uvjeti u kada blok upoznao. U ovom primjeru, Podnositelj zahtjeva uloga je postavljena kao upravitelj
5.2. Tablice odluka
Tablica odluka pruža mogućnost definiranja pravila u unaprijed formatiranoj proračunskoj tablici Excel. Prednost Droolova stola za odlučivanje je u tome što ih je lako razumjeti čak i netehničkoj osobi.
Također, korisno je kada postoje slična pravila, ali s različitim vrijednostima, u ovom je slučaju lakše dodati novi redak na excel listu za razliku od pisanja novog pravila u.drl datoteke. Pogledajmo kakva je struktura tablice odluka s primjerom primjene naljepnice na proizvod na temelju vrste proizvoda:
Tablica odluka grupirana je u različite odjeljke, a gornji je poput odjeljka zaglavlja u kojem smo odredili RuleSet (tj. paket u kojem se nalaze datoteke pravila), Uvoz (Java klase koje se uvoze) i Bilješke (komentari o svrsi pravila).
Nazvan je središnji odjeljak u kojem definiramo pravila Tablica pravila koja grupira pravila koja se primjenjuju na isti objekt domene.
U sljedećem redu imamo vrste stupaca STANJE i AKCIJSKI. Unutar ovih stupaca možemo pristupiti svojstvima objekta domene spomenutom u jednom retku i njihovim vrijednostima u sljedećim retcima.
Mehanizam za aktiviranje pravila sličan je onome što smo vidjeli .drl datoteke.
Rezultat primjene ovih pravila možemo provjeriti izvršavanjem testa:
@Test javna void whenProductTypeElectronic_ThenLabelBarcode () {Proizvod proizvoda = novi proizvod ("Mikrovalna pećnica", "Elektronička"); product = productService.applyLabelToProduct (proizvod); assertEquals ("BarCode", product.getLabel ()); }
6. Zaključak
U ovom kratkom članku istražili smo upotrebu Droolova kao pokretača poslovnog pravila u našoj aplikaciji. Također smo vidjeli više načina na koje možemo napisati pravila na jeziku pravila Drools, kao i na lako razumljiv jezik u proračunskim tablicama.
Kao i uvijek, cjeloviti kôd za ovaj članak dostupan je na GitHubu.