Introduktion til Drools

1. Oversigt

Drools er en løsning til Business Rule Management System (BRMS). Det giver en regelmotor, der behandler fakta og producerer output som et resultat af regler og faktabehandling. Centralisering af forretningslogik gør det muligt at indføre ændringer hurtigt og billigt.

Det bygger også bro mellem forretnings- og teknisk hold ved at give mulighed for at skrive reglerne i et format, der er let at forstå.

2. Maven-afhængigheder

For at komme i gang med Drools skal vi først tilføje et par afhængigheder i vores pom.xml:

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

Den seneste version af begge afhængigheder er tilgængelig på Maven Central Repository som kie-ci og sikler-beslutningstabeller.

3. Drools Basics

Vi skal se på grundlæggende begreber i Drools:

  • Fakta - repræsenterer data, der fungerer som input til regler
  • Arbejdshukommelse et lager med Fakta, hvor de bruges til mønstermatchning og kan ændres, indsættes og fjernes
  • Herske - repræsenterer en enkelt regel, der associeres Fakta med matchende handlinger. Det kan skrives på Drools Rule Language i .drl filer eller som Beslutningstabel i et Excel-regneark
  • Viden session - det indeholder alle de ressourcer, der kræves til fyringsregler alle Fakta indsættes i sessionen, og derefter matches matchende regler
  • Videnbase - repræsenterer viden i Drools økosystem, den har information om de ressourcer, hvor Regler findes, og det skaber også Viden session
  • ModulEt modul indeholder flere vidensbaser, som kan holde forskellige sessioner

4. Java-konfiguration

For at affyre regler for en given data er vi nødt til at instantiere rammerne, der gives klasser med oplysninger om placeringen af ​​regelfiler og Fakta:

4.1. KieFileSystem

Først skal vi indstille KieFileSystem bønne; dette er et in-memory filsystem leveret af rammen. Følgende kode giver containeren til at definere Drools-ressourcerne som reglerfiler, beslutningstabeller, programmatisk:

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

Her REGLER_PATH angiver placeringen af ​​regelfiler på filsystemet. Her læser vi filerne fra klassesti hvilket typisk er / src / main / ressourcer i tilfælde af et Maven-projekt.

4.2. KieContainer

Derefter skal vi indstille KieContainer som er en pladsholder for alle KieBases specielt KieModule. KieContainer er bygget ved hjælp af andre bønner inklusive KieFileSystem, KieModule, og KieBuilder.

Det buildAll () metode påberåbt den KieBuilder bygger alle ressourcer og binder dem til KieBase. Det udføres kun med succes, når det er i stand til at finde og validere alle regelfilerne:

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

Reglerne affyres ved at åbne en KieSession bønne - som kan hentes fra KieContainer:

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

5. Implementeringsregler

Nu hvor vi er færdige med opsætningen, lad os se på et par muligheder for at oprette regler.

Vi undersøger implementeringen af ​​reglen ved et eksempel på at kategorisere en ansøger til en bestemt rolle baseret på hans nuværende løn og antallet af års erfaring, han har.

5.1. Drools-regelfil (.drl)

Kort sagt, Drools-regelfilen indeholder alle forretningsregler.

En regel inkluderer en Hvornår-så konstruere, her Hvornår sektion viser den tilstand, der skal kontrolleres, og Derefter sektion viser den handling, der skal træffes, hvis betingelsen er opfyldt:

pakke com.baeldung.drools.rules; import com.baeldung.drools.model.Applicant; global com.baeldung.drools.model.SuggestedRole suggestedRole; dialekt "mvel" regel "Suggest Manager Role" når ansøger (experienceInYears> 10) ansøger (currentSalary> 1000000 && currentSalary <= 2500000) derefter foreslog Roll.setRole ("Manager"); ende

Denne regel kan affyres ved at indsætte Ansøger og Foreslået rolle fakta i KieSession:

public SuggestedRole suggestARoleForApplicant (Ansøgeransøger, SuggestedRole suggestRole) {KieSession kieSession = kieContainer.newKieSession (); kieSession.insert (ansøger); kieSession.setGlobal ("foreslået rolle", foreslået rolle); kieSession.fireAllRules (); // ...}

Det tester to betingelser på Ansøger forekomst og derefter baseret på opfyldelsen af ​​begge betingelser indstiller den Rolle felt i Foreslået rolle objekt.

Dette kan verificeres ved at udføre testen:

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

I dette eksempel har vi brugt nogle få nøgleord, der leveres med Drools. Lad os forstå deres anvendelse:

  • pakke - dette er det pakkenavn, vi angiver i kmodule.xml, regelfilen er placeret inde i denne pakke
  • importere - dette svarer til Java importere erklæring, her skal vi specificere de klasser, som vi indsætter i KnowledgeSession
  • global - dette bruges til at definere en global niveauvariabel for en session; dette kan bruges til at sende inputparameter eller til at få en outputparameter til at opsummere informationen til en session
  • dialekt - en dialekt specificerer den syntaks, der anvendes i udtrykkene i tilstandssektionen eller handlingsafsnittet. Som standard er dialekten Java. Drools understøtter også dialekt mvel; det er et ekspressionssprog til Java-baserede applikationer. Det understøtter adgang til mark og metode / getter
  • Herske - dette definerer en regelblok med et regelnavn
  • hvornår - dette specificerer en regelbetingelse, i dette eksempel er de betingelser, der kontrolleres Ansøger at have experienceInYears mere end ti år og nuværende løn inden for et bestemt interval
  • derefter - denne blok udfører handlingen, når forholdene i hvornår blok mødtes. I dette eksempel er Ansøger rolle er angivet som Manager

5.2. Beslutningstabeller

En beslutningstabel giver mulighed for at definere regler i et forudformateret Excel-regneark. Fordelen med Drools forudsat beslutningstabel er, at de er lette at forstå, selv for en ikke-teknisk person.

Det er også nyttigt, når der er lignende regler, men i forskellige tilfælde er det i dette tilfælde lettere at tilføje en ny række på excel-ark i modsætning til at skrive en ny regel i.drl filer. Lad os se, hvad strukturen i en beslutningstabel med et eksempel på anvendelse af etiketten på et produkt baseret på produkttypen:

Beslutningstabellen er grupperet i forskellige sektioner, den øverste er som en overskrift, hvor vi specificerer Regelsæt (dvs. pakke hvor regelfiler findes), Importere (Java-klasser, der skal importeres) og Bemærkninger (kommentarer til formålet med regler).

Det centrale afsnit, hvor vi definerer regler, kaldes Regeltabel der grupperer de regler, der anvendes på det samme domæneobjekt.

I den næste række har vi kolonnetyper TILSTAND og HANDLING. Inden for disse kolonner kan vi få adgang til egenskaberne for domæneobjektet nævnt i en række og deres værdier i de efterfølgende rækker.

Mekanismen til at affyre reglerne svarer til det, vi har set med .drl filer.

Vi kan kontrollere resultatet af anvendelsen af ​​disse regler ved at udføre testen:

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

6. Konklusion

I denne hurtige artikel har vi undersøgt brugen af ​​Drools som en forretningsregelmotor i vores applikation. Vi har også set de mange måder, hvorpå vi kan skrive reglerne på Drools regel sprog såvel som i let at forstå sproget i regneark.

Som altid er den komplette kode til denne artikel tilgængelig på GitHub.


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