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
  • ModulModul 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.