Drools koristeći pravila iz Excel datoteka
1. Pregled
Drools ima podršku za upravljanje poslovnim pravilima u formatu proračunske tablice.
U ovom ćemo članku vidjeti brzi primjer upotrebe Droolova za upravljanje poslovnim pravilima pomoću Excel datoteke.
2. Ovisnosti Mavena
Dodajmo potrebne ovisnosti Droolova u našu aplikaciju:
org.kie kie-ci 7.1.0.Beta2 org.drools drools-decitables 7.1.0.Beta2
Najnoviju verziju ovih ovisnosti možete pronaći na kie-ci i drools-decibables.
3. Utvrđivanje pravila u Excelu
Za naš primjer, definirajmo pravila za određivanje popusta na temelju vrste kupca i broja godina kupca:
- Pojedinačni kupci s više od 3 godine ostvaruju popust od 15%
- Pojedinačni kupci s manje od 3 godine ostvaruju popust od 5%
- Svi poslovni kupci ostvaruju popust od 20%
3.1. Datoteka Excel
Počnimo s izradom naše excel datoteke prema specifičnoj strukturi i ključnim riječima koje zahtijevaju Drools:
Za naš jednostavni primjer koristili smo najrelevantniji skup ključnih riječi:
- RuleSet - označava početak tablice odluka
- Uvoz - Java klase korištene u pravilima
- Tablica pravila - označava početak skupa pravila
- Ime - Naziv pravila
- STANJE - isječak koda stanja koji se provjerava prema ulaznim podacima. Pravilo treba sadržavati barem jedan uvjet
- AKCIJSKI - isječak koda radnje koju treba poduzeti ako su ispunjeni uvjeti pravila. Pravilo treba sadržavati barem jednu radnju. U primjeru zovemo setDiscount na Kupac objekt
Uz to, koristili smo i Kupac klase u datoteci Excel. Pa, kreirajmo to sada.
3.2. The Kupac Razred
Kao što se može vidjeti iz UVJETA i AKCIJE u excel listu, koristimo objekt Kupac klasa za ulazne podatke (tip i godine) i za pohranu rezultata (popust).
The Kupac razred:
kupac javne klase {tip privatnog kupca; privatne int godine; privatni int popust; // Standardni getteri i postavljači public enum CustomerType {INDIVIDUAL, BUSINESS; }}
4. Stvaranje instance Drools pravila pravila
Prije nego što možemo izvršiti pravila koja smo definirali, moramo raditi s instancom Drools pravila motora. Za to moramo koristiti Kie jezgrene komponente.
4.1. KieServices
The KieServices klasa pruža pristup svim objektima Kie build i runtime. Pruža nekoliko tvornica, usluga i korisnih metoda. Pa, hajde da se prvo dohvatimo a KieServices primjer:
KieServices kieServices = KieServices.Factory.get ();
Korištenjem KieServices stvorit ćemo nove primjerke KieFileSystem, KieBuilder, i KieContainer.
4.2. KieFileSystem
KieFileSystem je virtualni sustav datoteka. Dodajte joj proračunsku tablicu Excel:
Resurs dt = ResourceFactory .newClassPathResource ("com / baeldung / drools / rules / Discount.xls", getClass ()); KieFileSystem kieFileSystem = kieServices.newKieFileSystem (). Write (dt);
4.3. KieBuilder
Sada, izgradite sadržaj KieFileSystem prosljeđivanjem KieBuilder:
KieBuilder kieBuilder = kieServices.newKieBuilder (kieFileSystem); kieBuilder.buildAll ();
Ako se uspješno izgradi, stvara KieModule (bilo koja tegla proizvedena od Mavena s kmodule.xml u sebi je KieModule).
4.4. KieRepository
Okvir automatski dodaje KieModule (rezultat gradnje) do KieRepository:
KieRepository kieRepository = kieServices.getRepository ();
4.5. KieContainer
Sada je moguće stvoriti novo KieContainer s ovim KieModule koristeći svoj ReleaseId. U ovom slučaju, Kie dodjeljuje zadani ReleaseId:
ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId (); KieContainer kieContainer = kieServices.newKieContainer (krDefaultReleaseId);
4.6. KieSession
Sada možemo dobiti KieSession od KieContainer. Naša aplikacija komunicira s KieSession, koji pohranjuje i izvršava na runtime podacima:
KieSession kieSession = kieContainer.newKieSession ();
5. Izvršenje pravila
Konačno, vrijeme je za pružanje ulaznih podataka i pokretanje pravila:
Kupac kupac = novi kupac (CustomerType.BUSINESS, 2); kieSession.insert (kupac); kieSession.fireAllRules ();
6. Ispitni slučajevi
Dodajmo sada nekoliko testnih slučajeva:
javna klasa DiscountExcelIntegrationTest {private KieSession kSession; @ Prije postavljanja javne praznine () {Resource dt = ResourceFactory .newClassPathResource ("com / baeldung / drools / rules / Discount.xls", getClass ()); kSession = novi DroolsBeanFactory (). getKieSession (dt); } @Test public void giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount () baca izuzetak {Kupac kupac = novi kupac (CustomerType.INDIVIDUAL, 5); kSession.insert (kupac); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 15); } @Test public void giveIndvidualRecent_whenFireRule_thenCorrectDiscount () baca izuzetak {Kupac kupac = novi kupac (CustomerType.INDIVIDUAL, 1); kSession.insert (kupac); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 5); } @Test public void giveBusinessAny_whenFireRule_thenCorrectDiscount () baca izuzetak {Kupac kupac = novi kupac (CustomerType.BUSINESS, 0); kSession.insert (kupac); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 20); }}
7. Rješavanje problema
Drools pretvara tablicu odluka u DRL. Zbog toga suočavanje s pogreškama i pogrešnim greškama u Excel datoteci može biti teško. Često se pogreške odnose na sadržaj DRL-a. Dakle, za rješavanje problema pomaže ispis i analiza DRL-a:
Resurs dt = ResourceFactory .newClassPathResource ("com / baeldung / drools / rules / Discount.xls", getClass ()); DecisionTableProviderImpl decisionTableProvider = novi DecisionTableProviderImpl (); Niz drl = decisionTableProvider.loadFromResource (dt, null);
8. Zaključak
U ovom smo članku vidjeli brzi primjer upotrebe Droolova za upravljanje poslovnim pravilima u proračunskoj tablici Excel. Vidjeli smo strukturu i minimalni skup ključnih riječi koji će se koristiti za definiranje pravila u Excel datoteci. Dalje, koristili smo Kie komponente za čitanje i aktiviranje pravila. Na kraju smo napisali test slučajeve kako bismo provjerili rezultate.
Kao i uvijek, primjer korišten u ovom članku može se naći u projektu Github.