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.


$config[zx-auto] not found$config[zx-overlay] not found