Drools bruker regler fra Excel-filer

1. Oversikt

Drools har støtte for å håndtere forretningsregler i et regnearkformat.

I denne artikkelen ser vi et raskt eksempel på bruk av Drools til å administrere forretningsregler ved hjelp av en Excel-fil.

2. Maven-avhengigheter

La oss legge til de nødvendige Drools-avhengighetene i applikasjonen vår:

 org.kie kie-ci 7.1.0.Beta2 org.drools sikler-beslutningstabeller 7.1.0.Beta2 

Den siste versjonen av disse avhengighetene finner du på kie-ci og drools-beslutningstabeller.

3. Definere regler i Excel

For vårt eksempel, la oss definere regler for å bestemme rabatt basert på kundetype og antall år som kunde:

  • Enkeltkunder med mer enn 3 år får 15% rabatt
  • Enkeltkunder med mindre enn 3 år får 5% rabatt
  • Alle forretningskunder får 20% rabatt

3.1. Excel-filen

La oss begynne med å lage vår excel-fil i henhold til den spesifikke strukturen og søkeordene som kreves av Drools:

For vårt enkle eksempel har vi brukt det mest relevante settet med nøkkelord:

  • RuleSet - angir begynnelsen på beslutningstabellen
  • Import - Java-klasser brukt i reglene
  • Regeltabell - angir begynnelsen på settet med regler
  • Navn - Navnet på regelen
  • TILSTAND - kodebiten for tilstanden som skal sjekkes mot inngangsdataene. En regel bør inneholde minst én tilstand
  • HANDLING - kodebiten for handlingen som skal utføres hvis vilkårene for regelen er oppfylt. En regel bør inneholde minst én handling. I eksemplet ringer vi setDiscountKunde gjenstand

I tillegg har vi brukt Kunde klasse i Excel-filen. Så la oss lage det nå.

3.2. De Kunde Klasse

Som det fremgår av BETINGELSENE og HANDLINGEN i excel-arket, bruker vi et objekt av Kunde klasse for inngangsdata (type og år) og lagre resultatet (rabatt).

De Kunde klasse:

offentlig klasse kunde {privat CustomerType type; private int år; privat int rabatt; // Standard getters and setters public enum CustomerType {INDIVIDUAL, BUSINESS; }}

4. Opprette Drools Rule Engine Instance

Før vi kan utføre reglene vi har definert, må vi jobbe med en forekomst av Drools regelmotor. For det må vi bruke Kie-kjernekomponenter.

4.1. KieServices

De KieServices klasse gir tilgang til alle Kie bygge- og kjøretidsanlegg. Det gir flere fabrikker, tjenester og bruksmetoder. Så la oss først få tak i en KieServices forekomst:

KieServices kieServices = KieServices.Factory.get ();

Ved å bruke KieServices skal vi lage nye forekomster av KieFileSystem, KieBuilder, og KieContainer.

4.2. KieFileSystem

KieFileSystem er et virtuelt filsystem. La oss legge til vårt Excel-regneark:

Ressurs dt = ResourceFactory .newClassPathResource ("com / baeldung / sikler / regler / Discount.xls", getClass ()); KieFileSystem kieFileSystem = kieServices.newKieFileSystem (). Skriv (dt); 

4.3. KieBuilder

Nå, bygg innholdet i KieFileSystem ved å overføre den til KieBuilder:

KieBuilder kieBuilder = kieServices.newKieBuilder (kieFileSystem); kieBuilder.buildAll ();

Hvis den er vellykket bygget, skaper den en KieModule (enhver Maven-produsert krukke med en kmodule.xml i, er en KieModule).

4.4. KieRepository

Rammeverket legger automatisk til KieModule (som følge av byggingen) til KieRepository:

KieRepository kieRepository = kieServices.getRepository ();

4.5. KieContainer

Det er nå mulig å lage et nytt KieContainer med dette KieModule bruker sin ReleaseId. I dette tilfellet tilordner Kie en standard Utgivelses-ID:

ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId (); KieContainer kieContainer = kieServices.newKieContainer (krDefaultReleaseId);

4.6. KieSession

Vi kan nå oppnå KieSession fra KieContainer. Søknaden vår samhandler med KieSession, som lagrer og kjører på kjøretidsdataene:

KieSession kieSession = kieContainer.newKieSession ();

5. Gjennomføring av reglene

Til slutt er det på tide å gi inndata og skyte ut reglene:

Kundekunde = ny kunde (CustomerType.BUSINESS, 2); kieSession.insert (kunde); kieSession.fireAllRules ();

6. Test tilfeller

La oss nå legge til noen testtilfeller:

offentlig klasse DiscountExcelIntegrationTest {private KieSession kSession; @Før offentlige ugyldige oppsett () {Resource dt = ResourceFactory .newClassPathResource ("com / baeldung / sikler / regler / Discount.xls", getClass ()); kSession = nye DroolsBeanFactory (). getKieSession (dt); } @Test offentlig ugyldighet giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount () kaster Unntak {Kundekunde = ny kunde (Kundetype.INDIVIDUAL, 5); kSession.insert (kunde); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 15); } @Test offentlig ugyldighet giveIndvidualRecent_whenFireRule_thenCorrectDiscount () kaster Unntak {Kundekunde = ny kunde (CustomerType.INDIVIDUAL, 1); kSession.insert (kunde); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 5); } @Test offentlig ugyldig giveBusinessAny_whenFireRule_thenCorrectDiscount () kaster Unntak {Kundekunde = ny kunde (Kundetype.BUSINESS, 0); kSession.insert (kunde); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 20); }}

7. Feilsøking

Drools konverterer beslutningstabellen til DRL. På grunn av det kan det være vanskelig å håndtere feil og skrivefeil i Excel-filen. Ofte refererer feilene til innholdet i DRL. Så for å feilsøke hjelper det å skrive ut og analysere DRL:

Ressurs dt = ResourceFactory .newClassPathResource ("com / baeldung / sikler / regler / Discount.xls", getClass ()); DecisionTableProviderImpl decisionTableProvider = ny DecisionTableProviderImpl (); String drl = decisionTableProvider.loadFromResource (dt, null);

8. Konklusjon

I denne artikkelen har vi sett et raskt eksempel på bruk av Drools til å administrere forretningsregler i et Excel-regneark. Vi har sett strukturen og det minimale settet med nøkkelord som skal brukes til å definere regler i en Excel-fil. Deretter har vi brukt Kie-komponenter til å lese og fyre opp reglene. Til slutt skrev vi testtilfeller for å verifisere resultatene.

Som alltid kan eksemplet som brukes i denne artikkelen bli funnet i Github-prosjektet.