Drools met behulp van regels uit Excel-bestanden

1. Overzicht

Drools heeft ondersteuning voor het beheren van bedrijfsregels in een spreadsheetformaat.

In dit artikel zullen we een snel voorbeeld zien van het gebruik van Drools om bedrijfsregels te beheren met behulp van een Excel-bestand.

2. Maven afhankelijkheden

Laten we de vereiste Drools-afhankelijkheden toevoegen aan onze applicatie:

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

De laatste versie van deze afhankelijkheden is te vinden op kie-ci en drools-decisiontables.

3. Regels definiëren in Excel

Laten we voor ons voorbeeld regels definiëren om de korting te bepalen op basis van het type klant en het aantal jaren als klant:

  • Individuele klanten ouder dan 3 jaar krijgen 15% korting
  • Individuele klanten met minder dan 3 jaar krijgen 5% korting
  • Alle zakelijke klanten krijgen 20% korting

3.1. Het Excel-bestand

Laten we beginnen met het maken van ons Excel-bestand volgens de specifieke structuur en trefwoorden die Drools nodig heeft:

Voor ons eenvoudige voorbeeld hebben we de meest relevante set zoekwoorden gebruikt:

  • RuleSet - geeft het begin van de beslissingstabel aan
  • Importeren - Java-klassen die in de regels worden gebruikt
  • RuleTable - geeft het begin van de set regels aan
  • Naam - Naam van de regel
  • STAAT - het codefragment van de conditie die moet worden gecontroleerd aan de hand van de invoergegevens. Een regel moet ten minste één voorwaarde bevatten
  • ACTIE - het codefragment van de actie die moet worden ondernomen als aan de voorwaarden van de regel is voldaan. Een regel moet ten minste één actie bevatten. In het voorbeeld bellen we setDiscount op de Klant voorwerp

Daarnaast hebben we de Klant klasse in het Excel-bestand. Dus laten we dat nu creëren.

3.2. De Klant Klasse

Zoals te zien is in de VOORWAARDEN en ACTIE in het Excel-blad, gebruiken we een object van de Klant klasse voor de invoergegevens (type en jaren) en om het resultaat op te slaan (korting).

De Klant klasse:

openbare klasse Klant {privé CustomerType-type; privé int jaren; privé int korting; // Standaard getters en setters openbare opsomming CustomerType {INDIVIDUAL, BUSINESS; }}

4. Drools Rule Engine-instantie maken

Voordat we de regels die we hebben gedefinieerd kunnen uitvoeren, moeten we werken met een instantie van Drools rule engine. Daarvoor moeten we Kie-kerncomponenten gebruiken.

4.1. KieServices

De KieServices class biedt toegang tot alle Kie build- en runtime-faciliteiten. Het biedt verschillende fabrieken, services en hulpprogramma's. Laten we dus eerst een KieServices voorbeeld:

KieServices kieServices = KieServices.Factory.get ();

Met behulp van de KieServices gaan we nieuwe exemplaren maken van KieFileSystem, KieBuilder, en KieContainer.

4.2. KieFileSystem

KieFileSystem is een virtueel bestandssysteem. Laten we er onze Excel-spreadsheet aan toevoegen:

Resource dt = ResourceFactory .newClassPathResource ("com / baeldung / drools / rules / Discount.xls", getClass ()); KieFileSystem kieFileSystem = kieServices.newKieFileSystem (). Write (dt); 

4.3. KieBuilder

Bouw nu de inhoud van het KieFileSystem door het door te geven aan KieBuilder:

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

Als het met succes is gebouwd, wordt er een KieModule (elke door Maven geproduceerde pot met een kmodule.xml erin, is een KieModule).

4.4. KieRepository

Het framework voegt automatisch het KieModule (als gevolg van de build) naar KieRepository:

KieRepository kieRepository = kieServices.getRepository ();

4.5. KieContainer

Het is nu mogelijk om een ​​nieuw KieContainer hiermee KieModule met behulp van zijn ReleaseId. In dit geval wijst Kie een standaard toe ReleaseId:

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

4.6. KieSession

We kunnen nu verkrijgen KieSession van de KieContainer. Onze applicatie werkt samen met de KieSession, die de runtime-gegevens opslaat en uitvoert:

KieSession kieSession = kieContainer.newKieSession ();

5. Het uitvoeren van de regels

Eindelijk is het tijd om invoergegevens te verstrekken en de regels te activeren:

Klant klant = nieuwe klant (CustomerType.BUSINESS, 2); kieSession.insert (klant); kieSession.fireAllRules ();

6. Testgevallen

Laten we nu enkele testcases toevoegen:

openbare klasse DiscountExcelIntegrationTest {privé KieSession kSession; @Before public void setup () {Resource dt = ResourceFactory .newClassPathResource ("com / baeldung / drools / rules / Discount.xls", getClass ()); kSession = nieuwe DroolsBeanFactory (). getKieSession (dt); } @Test public void giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount () gooit uitzondering {klant klant = nieuwe klant (CustomerType.INDIVIDUAL, 5); kSession.insert (klant); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 15); } @Test public void giveIndvidualRecent_whenFireRule_thenCorrectDiscount () gooit Uitzondering {Klant klant = nieuwe klant (CustomerType.INDIVIDUAL, 1); kSession.insert (klant); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 5); } @Test public void giveBusinessAny_whenFireRule_thenCorrectDiscount () genereert Uitzondering {Klant klant = nieuwe klant (CustomerType.BUSINESS, 0); kSession.insert (klant); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 20); }}

7. Probleemoplossing

Drools zet de beslissingstabel om naar DRL. Daarom kan het moeilijk zijn om met fouten en typefouten in het Excel-bestand om te gaan. Vaak verwijzen de fouten naar de inhoud van de MVO. Dus om problemen op te lossen, helpt het om de DRL af te drukken en te analyseren:

Resource dt = ResourceFactory .newClassPathResource ("com / baeldung / drools / rules / Discount.xls", getClass ()); DecisionTableProviderImpl decisionTableProvider = nieuwe DecisionTableProviderImpl (); String drl = decisionTableProvider.loadFromResource (dt, null);

8. Conclusie

In dit artikel hebben we een snel voorbeeld gezien van het gebruik van Drools om bedrijfsregels in een Excel-spreadsheet te beheren. We hebben de structuur en de minimale set trefwoorden gezien die moeten worden gebruikt bij het definiëren van regels in een Excel-bestand. Vervolgens hebben we Kie-componenten gebruikt om de regels te lezen en te activeren. Ten slotte hebben we testcases geschreven om de resultaten te verifiëren.

Zoals altijd is het voorbeeld dat in dit artikel wordt gebruikt, te vinden in het Github-project.