Drools ved hjælp af regler fra Excel-filer
1. Oversigt
Drools har support til styring af forretningsregler i et regnearkformat.
I denne artikel ser vi et hurtigt eksempel på brug af Drools til at styre forretningsregler ved hjælp af en Excel-fil.
2. Maven-afhængigheder
Lad os tilføje de nødvendige Drools-afhængigheder i vores applikation:
org.kie kie-ci 7.1.0.Beta2 org.drools sikler-beslutningstabeller 7.1.0.Beta2
Den seneste version af disse afhængigheder kan findes på kie-ci og sikler-beslutningstabeller.
3. Definition af regler i Excel
Lad os i vores eksempel definere regler til bestemmelse af rabat baseret på kundetype og antallet af år som kunde:
- Enkeltkunder med mere end 3 år får 15% rabat
- Enkeltkunder med mindre end 3 år får 5% rabat
- Alle erhvervskunder får 20% rabat
3.1. Excel-filen
Lad os begynde med at oprette vores excel-fil i henhold til den specifikke struktur og nøgleord, der kræves af Drools:

Til vores enkle eksempel har vi brugt det mest relevante sæt søgeord:
- Regelsæt - angiver begyndelsen på beslutningstabellen
- Importere - Java-klasser, der bruges i reglerne
- Regeltabel - angiver begyndelsen på regelsættet
- Navn - Regelens navn
- TILSTAND - kodestykke af den betingelse, der skal kontrolleres i forhold til inputdataene. En regel skal indeholde mindst én betingelse
- HANDLING - kodestykket for den handling, der skal udføres, hvis betingelserne for reglen er opfyldt. En regel skal indeholde mindst én handling. I eksemplet kalder vi setDiscount på den Kunde objekt
Derudover har vi brugt Kunde klasse i Excel-filen. Så lad os oprette det nu.
3.2. Det Kunde Klasse
Som det kan ses af BETINGELSER og HANDLING i excel-arket, bruger vi et objekt af Kunde klasse for inputdataene (type og flere år) og gemme resultatet (rabat).
Det Kunde klasse:
offentlig klasse kunde {privat CustomerType type; private int år; privat int-rabat; // Standard getters and setters public enum CustomerType {INDIVIDUAL, BUSINESS; }}
4. Oprettelse af Drools-regelmotorinstans
Før vi kan udføre de regler, som vi har defineret, skal vi arbejde med en forekomst af Drools regelmotor. Til det er vi nødt til at bruge Kie-kernekomponenter.
4.1. KieServices
Det KieServices klasse giver adgang til alle Kie build- og runtime-faciliteter. Det giver flere fabrikker, tjenester og hjælpemetoder. Så lad os først få fat i en KieServices eksempel:
KieServices kieServices = KieServices.Factory.get ();
Ved hjælp af KieServices skal vi oprette nye forekomster af KieFileSystem, KieBuilderog KieContainer.
4.2. KieFileSystem
KieFileSystem er et virtuelt filsystem. Lad os tilføje vores Excel-regneark til det:
Ressource dt = ResourceFactory .newClassPathResource ("com / baeldung / sikler / regler / Discount.xls", getClass ()); KieFileSystem kieFileSystem = kieServices.newKieFileSystem (). Skriv (dt);
4.3. KieBuilder
Nu skal du oprette indholdet af KieFileSystem ved at videregive det til KieBuilder:
KieBuilder kieBuilder = kieServices.newKieBuilder (kieFileSystem); kieBuilder.buildAll ();
Hvis den er bygget med succes, opretter den en KieModule (enhver Maven-produceret krukke med en kmodule.xml i er en KieModule).
4.4. KieRepository
Rammen tilføjer automatisk KieModule (som følge af build) til KieRepository:
KieRepository kieRepository = kieServices.getRepository ();
4.5. KieContainer
Det er nu muligt at oprette et nyt KieContainer med dette KieModule ved hjælp af dens ReleaseId. I dette tilfælde tildeler Kie en standard Udgivelses-id:
ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId (); KieContainer kieContainer = kieServices.newKieContainer (krDefaultReleaseId);
4.6. KieSession
Vi kan nu få KieSession fra KieContainer. Vores ansøgning interagerer med KieSession, der gemmer og udfører på runtime-data:
KieSession kieSession = kieContainer.newKieSession ();
5. Udførelse af reglerne
Endelig er det tid til at levere inputdata og fyr reglerne:
Kundekunde = ny kunde (CustomerType.BUSINESS, 2); kieSession.insert (kunde); kieSession.fireAllRules ();
6. Test tilfælde
Lad os nu tilføje nogle testsager:
offentlig klasse DiscountExcelIntegrationTest {private KieSession kSession; @Før offentlig ugyldig opsætning () {Resource dt = ResourceFactory .newClassPathResource ("com / baeldung / sikler / regler / Discount.xls", getClass ()); kSession = ny DroolsBeanFactory (). getKieSession (dt); } @ Test offentligt ugyldigt giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount () kaster Undtagelse {Kundekunde = ny kunde (Kundetype.INDIVIDUAL, 5); kSession.insert (kunde); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 15); } @Test offentlig ugyldighed giveIndvidualRecent_whenFireRule_thenCorrectDiscount () kaster Undtagelse {Kundekunde = ny kunde (CustomerType.INDIVIDUAL, 1); kSession.insert (kunde); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 5); } @Test offentligt ugyldigt giveBusinessAny_whenFireRule_thenCorrectDiscount () kaster undtagelse {Kundekunde = ny kunde (CustomerType.BUSINESS, 0); kSession.insert (kunde); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 20); }}
7. Fejlfinding
Drools konverterer beslutningstabellen til DRL. På grund af det kan det være svært at håndtere fejl og stavefejl i Excel-filen. Ofte henviser fejlene til indholdet af DRL. Så for at fejlfinde hjælper det med at udskrive og analysere DRL:
Ressource dt = ResourceFactory .newClassPathResource ("com / baeldung / sikler / regler / Discount.xls", getClass ()); DecisionTableProviderImpl decisionTableProvider = ny DecisionTableProviderImpl (); String drl = decisionTableProvider.loadFromResource (dt, null);
8. Konklusion
I denne artikel har vi set et hurtigt eksempel på brug af Drools til at styre forretningsregler i et Excel-regneark. Vi har set strukturen og det minimale sæt nøgleord, der skal bruges til at definere regler i en Excel-fil. Dernæst har vi brugt Kie-komponenter til at læse og affyre reglerne. Endelig skrev vi testsager for at verificere resultaterne.
Som altid kan eksemplet i denne artikel findes i Github-projektet.