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 setDiscount på Kunde 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.