Introduksjon til Drools

1. Oversikt

Drools er en Business Rule Management System (BRMS) løsning. Det gir en regelmotor som behandler fakta og produserer produksjon som et resultat av regler og faktabehandling. Sentralisering av forretningslogikken gjør det mulig å innføre endringer raskt og billig.

Det bygger også bro mellom forretnings- og tekniske team ved å tilby en mulighet for å skrive reglene i et format som er lett å forstå.

2. Maven-avhengigheter

For å komme i gang med Drools, må vi først legge til et par avhengigheter i vår pom.xml:

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

Den siste versjonen av begge avhengighetene er tilgjengelig på Maven Central Repository som kie-ci og sikler-beslutningstabeller.

3. Drools Basics

Vi skal se på grunnleggende konsepter for Drools:

  • Fakta - representerer data som fungerer som input for regler
  • Arbeidsminne et lager med Fakta, hvor de brukes til mønstermatching og kan modifiseres, settes inn og fjernes
  • Regel - representerer en enkelt regel som assosieres Fakta med matchende handlinger. Det kan skrives på Drools Rule Language i .drl filer eller som Beslutningstabell i et Excel-regneark
  • Kunnskapssession - den har alle ressursene som kreves for skyteregler; alle Fakta blir satt inn i økten, og deretter blir matchende regler avfyrt
  • Kunnskapsbase - representerer kunnskapen i Drools økosystem, den har informasjonen om ressursene der Regler blir funnet, og også skaper den Kunnskapssession
  • ModulEn modul har flere kunnskapsbaser som kan holde forskjellige økter

4. Java-konfigurasjon

For å avfire regler for en gitt data, må vi sette i gang rammeverket klasser med informasjon om plasseringen av regelfiler og Fakta:

4.1. KieFileSystem

Først må vi stille inn KieFileSystem bønne; dette er et filsystem i minnet som leveres av rammeverket. Følgende kode gir beholderen for å definere Drools-ressursene som regelfiler, beslutningstabeller, programmatisk:

offentlig KieFileSystem kieFileSystem () kaster IOException {KieFileSystem kieFileSystem = getKieServices (). newKieFileSystem (); for (Ressursfil: getRuleFiles ()) {kieFileSystem.write (ResourceFactory.newClassPathResource (RULES_PATH + file.getFilename (), "UTF-8")); } returner kieFileSystem; }

Her REGLER_PATH angir plasseringen av regelfiler på filsystemet. Her leser vi filene fra klassesti som vanligvis er / src / main / resources i tilfelle et Maven-prosjekt.

4.2. KieContainer

Deretter må vi stille inn KieContainer som er en plassholder for alle KieBases for spesielt KieModule. KieContainer er bygget ved hjelp av andre bønner inkludert KieFileSystem, KieModule, og KieBuilder.

De buildAll () metode påkalt på KieBuilder bygger alle ressursene og knytter dem til KieBase. Den kjøres bare vellykket når den kan finne og validere alle regelfilene:

offentlig KieContainer kieContainer () kaster IOException {KieRepository kieRepository = getKieServices (). getRepository (); kieRepository.addKieModule (ny KieModule () {public ReleaseId getReleaseId () {return kieRepository.getDefaultReleaseId ();}}); KieBuilder kieBuilder = getKieServices () .nyeKieBuilder (kieFileSystem ()) .buildAll (); returner getKieServices (). newKieContainer (kieRepository.getDefaultReleaseId ()); }

4.3. KieSession

Reglene fyres ved å åpne en KieSession bønne - som kan hentes fra KieContainer:

offentlig KieSession kieSession () kaster IOException {retur kieContainer (). newKieSession (); }

5. Implementeringsregler

Nå som vi er ferdige med oppsettet, la oss se på et par alternativer for å lage regler.

Vi vil utforske implementeringen av regelen med et eksempel på å kategorisere en søker for en bestemt rolle, basert på hans nåværende lønn og antall års erfaring han har.

5.1. Drools regelfil (.drl)

Enkelt sagt inneholder Drools-regelfilen alle forretningsregler.

En regel inkluderer a Når da konstruere, her Når delen viser tilstanden som skal kontrolleres, og Deretter delen viser tiltakene som skal utføres hvis vilkåret er oppfylt:

pakke com.baeldung.drools.rules; importere com.baeldung.drools.model.Applicant; global com.baeldung.drools.model.SuggestedRole suggestedRole; dialekt "mvel" regel "Suggest Manager Role" når søker (experienceInYears> 10) søker (currentSalary> 1000000 && currentSalary <= 2500000) deretter foreslo Roll.setRole ("Manager"); slutt

Denne regelen kan avfyres ved å sette inn Søker og Foreslått rolle fakta i KieSession:

public SuggestedRole suggestARoleForApplicant (søker søker, SuggestedRole suggestRole) {KieSession kieSession = kieContainer.newKieSession (); kieSession.insert (søker); kieSession.setGlobal ("foreslått rolle", foreslått rolle); kieSession.fireAllRules (); // ...}

Det tester to forhold på Søker forekomst og deretter basert på oppfyllelsen av begge vilkårene Roll felt i Foreslått rolle gjenstand.

Dette kan bekreftes ved å utføre testen:

@Test offentlig ugyldig nårCriteriaMatching_ThenSuggestManagerRole () {Søker søker = ny søker ("David", 37, 1600000.0,11); SuggestedRole suggestedRole = new SuggestedRole (); søkerService.suggestARoleForApplicant (søker, foreslått rolle); assertEquals ("Manager", suggestRole.getRole ()); }

I dette eksemplet har vi brukt få søkeord fra Drools. La oss forstå bruken av dem:

  • pakke - dette er pakkenavnet vi spesifiserer i kmodule.xml, regelfilen ligger inne i denne pakken
  • import - dette ligner på Java import uttalelse, her må vi spesifisere klassene som vi setter inn i KnowledgeSession
  • global - dette brukes til å definere en global variabel for en økt; dette kan brukes til å overføre inngangsparameter eller for å få en utgangsparameter for å oppsummere informasjonen for en økt
  • dialekt - en dialekt spesifiserer syntaksen som brukes i uttrykkene i tilstandsseksjonen eller handlingsseksjonen. Som standard er dialekten Java. Drools støtter også dialekt mvel; det er et uttrykksspråk for Java-baserte applikasjoner. Den støtter tilgang til felt og metode / getter
  • regel - dette definerer en regelblokk med et regelnavn
  • når - dette spesifiserer en regelbetingelse, i dette eksemplet er betingelsene som blir sjekket Søker har experienceInYears mer enn ti år og nåværende lønn i et bestemt område
  • deretter - denne blokken utfører handlingen når forholdene i når blokk oppfylt. I dette eksemplet er Søker rolle er satt som leder

5.2. Beslutningstabeller

En beslutningstabell gir muligheten til å definere regler i et forhåndsformatert Excel-regneark. Fordelen med Drools gitt beslutningstabell er at de er lette å forstå selv for en ikke-teknisk person.

Det er også nyttig når det er lignende regler, men med forskjellige verdier, i dette tilfellet, er det lettere å legge til en ny rad på excel-ark i motsetning til å skrive en ny regel i.drl filer. La oss se hvordan strukturen til en beslutningstabell med et eksempel på bruk av etiketten på et produkt basert på produkttypen:

Beslutningstabellen er gruppert i forskjellige seksjoner, den øverste er som en topptekst der vi spesifiserer RuleSet (dvs. pakke der regelfiler ligger), Import (Java-klasser som skal importeres) og Merknader (kommentarer om formålet med regler).

Den sentrale delen der vi definerer regler kalles Regeltabell som grupperer reglene som brukes på samme domeneobjekt.

I neste rad har vi kolonnetyper TILSTAND og HANDLING. Innenfor disse kolonnene kan vi få tilgang til egenskapene til domeneobjektet nevnt i en rad og deres verdier i de påfølgende radene.

Mekanismen for å fyre ut reglene er lik den vi har sett med .drl filer.

Vi kan verifisere resultatet av å bruke disse reglene ved å utføre testen:

@Test offentlig ugyldig nårProductTypeElectronic_ThenLabelBarcode () {Produktprodukt = nytt produkt ("Mikrobølgeovn", "Elektronisk"); produkt = productService.applyLabelToProduct (produkt); assertEquals ("BarCode", product.getLabel ()); }

6. Konklusjon

I denne raske artikkelen har vi utforsket bruk av Drools som en forretningsregelmotor i applikasjonen vår. Vi har også sett flere måter vi kan skrive reglene på Drools regelspråk, så vel som i lett å forstå språket i regneark.

Som alltid er den fullstendige koden for denne artikkelen tilgjengelig på GitHub.


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