Inleiding tot Drools

1. Overzicht

Drools is een BRMS-oplossing (Business Rule Management System). Het biedt een rule engine die feiten verwerkt en output produceert als resultaat van de verwerking van regels en feiten. Centralisatie van bedrijfslogica maakt het mogelijk om snel en goedkoop veranderingen door te voeren.

Het overbrugt ook de kloof tussen de zakelijke en technische teams door de mogelijkheid te bieden om de regels te schrijven in een formaat dat gemakkelijk te begrijpen is.

2. Maven afhankelijkheden

Om met Drools aan de slag te gaan, moeten we eerst een aantal afhankelijkheden toevoegen aan onze pom.xml:

 org.kie kie-ci 7.1.0.Beta1 org.drools drools-beslissingstabellen 7.1.0.Beta1 

De laatste versie van beide afhankelijkheden is beschikbaar op Maven Central Repository als kie-ci en drools-decisiontables.

3. Drools Basics

We gaan de basisconcepten van Drools bekijken:

  • Feiten - staat voor gegevens die dienen als invoer voor regels
  • Werkgeheugen een opslag met Feiten, waar ze worden gebruikt voor het matchen van patronen en kunnen worden gewijzigd, ingevoegd en verwijderd
  • Regel - staat voor een enkele regel die associeert Feiten met bijpassende acties. Het kan worden geschreven in Drools Rule Language in de .drl bestanden of als Beslissingstabel in een Excel-spreadsheet
  • Kennissessie - het bevat alle middelen die nodig zijn voor het afvuren van regels; alle Feiten worden in de sessie ingevoegd en vervolgens worden de overeenkomende regels geactiveerd
  • Kennis basis - vertegenwoordigt de kennis in het Drools-ecosysteem, het heeft de informatie over de bronnen waar Reglement worden gevonden, en het creëert ook de Kennissessie
  • ModuleEen module bevat meerdere Knowledge Bases die verschillende sessies kunnen houden

4. Java-configuratie

Om regels op bepaalde gegevens te activeren, moeten we de door het raamwerk verstrekte klassen instantiëren met informatie over de locatie van regelbestanden en de Feiten:

4.1. KieFileSystem

Eerst moeten we de KieFileSystem Boon; dit is een bestandssysteem in het geheugen dat door het framework wordt geleverd. De volgende code biedt de container om de Drools-bronnen zoals regelbestanden, beslissingstabellen, programmatisch te definiëren:

openbaar KieFileSystem kieFileSystem () gooit IOException {KieFileSystem kieFileSystem = getKieServices (). newKieFileSystem (); voor (Bronbestand: getRuleFiles ()) {kieFileSystem.write (ResourceFactory.newClassPathResource (RULES_PATH + file.getFilename (), "UTF-8")); } terugkeer kieFileSystem; }

Hier RULES_PATH geeft de locatie van regelbestanden op het bestandssysteem aan. Hier lezen we de bestanden van klassenpad wat typisch is / src / main / resources in het geval van een Maven-project.

4.2. KieContainer

Vervolgens moeten we de KieContainer wat een tijdelijke aanduiding is voor alle KieBases voor in het bijzonder KieModule. KieContainer is gebouwd met behulp van andere bonen, waaronder KieFileSystem, KieModule, en KieBuilder.

De buildAll () methode aangeroepen op KieBuilder bouwt alle bronnen op en verbindt ze eraan KieBase. Het wordt alleen succesvol uitgevoerd als het alle regelbestanden kan vinden en valideren:

openbare KieContainer kieContainer () gooit IOException {KieRepository kieRepository = getKieServices (). getRepository (); kieRepository.addKieModule (nieuwe KieModule () {openbare ReleaseId getReleaseId () {terugkeer kieRepository.getDefaultReleaseId ();}}); KieBuilder kieBuilder = getKieServices () .newKieBuilder (kieFileSystem ()) .buildAll (); retourneer getKieServices (). newKieContainer (kieRepository.getDefaultReleaseId ()); }

4.3. KieSession

De regels worden afgevuurd door een KieSession bean - die kan worden opgehaald uit KieContainer:

openbare KieSession kieSession () gooit IOException {return kieContainer (). newKieSession (); }

5. Uitvoeringsregels

Nu we klaar zijn met de installatie, gaan we eens kijken naar een aantal opties voor het maken van regels.

We onderzoeken de implementatie van de regels aan de hand van een voorbeeld van het categoriseren van een sollicitant voor een specifieke functie, op basis van zijn huidige salaris en aantal jaren ervaring dat hij heeft.

5.1. Drools-regelbestand (.drl)

Simpel gezegd, het Drools-regelbestand bevat alle bedrijfsregels.

Een regel bevat een Wanneer dan construeren, hier de Wanneer sectie vermeldt de conditie die moet worden gecontroleerd, en Dan sectie vermeldt de actie die moet worden ondernomen als aan de voorwaarde is voldaan:

pakket com.baeldung.drools.rules; importeer com.baeldung.drools.model.Applicant; globaal com.baeldung.drools.model.SuggestedRole suggereerdeRole; dialect "mvel" regel "Stel Manager Rol voor" wanneer Aanvrager (experienceInYears> 10) Aanvrager (currentSalary> 1000000 && currentSalary <= 2500000) vervolgens suggereerdeRole.setRole ("Manager"); einde

Deze regel kan worden geactiveerd door de Aanvrager en SuggestedRole feiten in KieSession:

openbare SuggestedRole suggestARoleForApplicant (Aanvrager aanvrager, SuggestedRole suggereerdeRole) {KieSession kieSession = kieContainer.newKieSession (); kieSession.insert (aanvrager); kieSession.setGlobal ("gesuggereerdRole", gesuggereerdRol); kieSession.fireAllRules (); // ...}

Het test twee voorwaarden op Aanvrager instantie en vervolgens op basis van de vervulling van beide voorwaarden stelt het de Rol veld in het SuggestedRole voorwerp.

Dit kan worden geverifieerd door de test uit te voeren:

@Test public void whenCriteriaMatching_ThenSuggestManagerRole () {Aanvrager aanvrager = nieuwe aanvrager ("David", 37, 1600000.0,11); SuggestedRole suggestedRole = new SuggestedRole (); sollicitantService.suggestARoleForApplicant (sollicitant, gesuggereerde rol); assertEquals ("Manager", suggestRole.getRole ()); }

In dit voorbeeld hebben we enkele door Drools opgegeven zoekwoorden gebruikt. Laten we hun gebruik begrijpen:

  • pakket - dit is de pakketnaam die we specificeren in het kmodule.xml, het regelbestand bevindt zich in dit pakket
  • importeren - dit is vergelijkbaar met Java importeren statement, hier moeten we de klassen specificeren die we invoegen in het Kennissessie
  • globaal - dit wordt gebruikt om een ​​variabele op globaal niveau voor een sessie te definiëren; dit kan worden gebruikt om een ​​invoerparameter door te geven of om een ​​uitvoerparameter te krijgen om de informatie voor een sessie samen te vatten
  • dialect - een dialect specificeert de syntaxis die wordt gebruikt in de uitdrukkingen in de conditiesectie of actiegedeelte. Standaard is het dialect Java. Drools ondersteunen ook dialect mvel; het is een expressietaal voor op Java gebaseerde applicaties. Het ondersteunt de veld- en methode / getter-toegang
  • regel - dit definieert een regelblok met een regelnaam
  • wanneer - dit specificeert een regelvoorwaarde, in dit voorbeeld zijn de voorwaarden die zijn aangevinkt Aanvrager hebben experienceInYears meer dan tien jaar en huidig ​​salaris in een bepaald bereik
  • dan - dit blok voert de actie uit wanneer de voorwaarden in het wanneer blok voldaan. In dit voorbeeld is de Aanvrager rol is ingesteld als Manager

5.2. Beslissingstabellen

Een beslissingstabel biedt de mogelijkheid om regels te definiëren in een vooraf opgemaakt Excel-spreadsheet. Het voordeel van de door Drools geleverde beslissingstabel is dat ze gemakkelijk te begrijpen zijn, zelfs voor een niet-technisch persoon.

Het is ook handig als er vergelijkbare regels zijn, maar met verschillende waarden, in dit geval is het gemakkelijker om een ​​nieuwe rij toe te voegen aan het Excel-blad in tegenstelling tot het schrijven van een nieuwe regel.drl bestanden. Laten we eens kijken wat de structuur van een beslissingstabel is met een voorbeeld van het aanbrengen van het label op een product op basis van het producttype:

De beslissingstabel is gegroepeerd in verschillende secties, de bovenste is als een koptekstsectie waarin we de RuleSet (d.w.z. pakket waar regelbestanden zich bevinden), Importeren (Java-klassen die moeten worden geïmporteerd) en Opmerkingen (opmerkingen over het doel van regels).

Het centrale gedeelte waar we regels definiëren, wordt genoemd RuleTable die de regels groepeert die op hetzelfde domeinobject worden toegepast.

In de volgende rij hebben we kolomtypen STAAT en ACTIE. Binnen deze kolommen hebben we toegang tot de eigenschappen van het domeinobject dat in de ene rij wordt genoemd en hun waarden in de daaropvolgende rijen.

Het mechanisme om de regels te activeren is vergelijkbaar met wat we hebben gezien .drl bestanden.

We kunnen het resultaat van het toepassen van deze regels verifiëren door de test uit te voeren:

@Test public void whenProductTypeElectronic_ThenLabelBarcode () {Product product = nieuw product ("Magnetron", "Elektronisch"); product = productService.applyLabelToProduct (product); assertEquals ("BarCode", product.getLabel ()); }

6. Conclusie

In dit korte artikel hebben we het gebruik van Drools als een bedrijfsregelengine in onze applicatie onderzocht. We hebben ook de verschillende manieren gezien waarop we de regels in de Drools-regeltaal kunnen schrijven, evenals in de gemakkelijk te begrijpen taal in spreadsheets.

Zoals altijd is de volledige code voor dit artikel beschikbaar op GitHub.