Drools az Excel fájlok szabályainak használatával

1. Áttekintés

A Drools támogatja az üzleti szabályok táblázatos formátumú kezelését.

Ebben a cikkben egy gyors példát láthatunk a Drools használatáról az üzleti szabályok kezeléséhez egy Excel fájl segítségével.

2. Maven-függőségek

Vegyük fel a szükséges Drools-függőségeket alkalmazásunkba:

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

Ezeknek a függőségeknek a legújabb verziója megtalálható a kie-ci és a drools-decisiontables oldalon.

3. Szabályok meghatározása az Excelben

Például definiáljunk szabályokat a kedvezmény meghatározásához az ügyfél típusa és az ügyfélként eltöltött évek száma alapján:

  • A 3 évnél idősebb egyéni vásárlók 15% kedvezményt kapnak
  • A 3 évnél fiatalabb egyéni ügyfelek 5% kedvezményt kapnak
  • Minden üzleti ügyfél 20% kedvezményt kap

3.1. Az Excel fájl

Kezdjük az excel fájlunk létrehozásával a Drools által megkövetelt sajátos struktúra és kulcsszavak szerint:

Egyszerű példánkként a legrelevánsabb kulcsszavakat használtuk:

  • RuleSet - a döntési táblázat elejét jelzi
  • Importálás - A szabályokban használt Java osztályok
  • RuleTable - a szabályhalmaz kezdetét jelzi
  • Név - A szabály neve
  • FELTÉTEL - a bemeneti adatokkal ellenőrizendő feltétel kódrészlete. A szabálynak tartalmaznia kell legalább egy feltételt
  • AKCIÓ - a szabály feltételeinek teljesülése esetén végrehajtandó művelet kódrészlete. A szabálynak tartalmaznia kell legalább egy műveletet. A példában hívunk setDiscount a Vevő tárgy

Ezenkívül a Vevő osztály az Excel fájlban. Tehát hozzuk létre ezt most.

3.2. A Vevő Osztály

Amint az az excel lap FELTÉTELEKBŐL és AKCIÓJÁBÓL látható, a. Objektumát használjuk Vevő osztály a bemeneti adatokhoz (típus és évek) és az eredmény tárolására (kedvezmény).

A Vevő osztály:

public class Ügyfél {private CustomerType típus; magán int évek; privát int kedvezmény; // Standard getters and setters public enum CustomerType {INDIVIDUAL, BUSINESS; }}

4. Drools szabály motor példány létrehozása

Mielőtt végre tudnánk hajtani a definiált szabályokat, dolgoznunk kell a Drools szabály motor egyik példányával. Ehhez a Kie alapkomponenseit kell használnunk.

4.1. KieServices

A KieServices osztály hozzáférést biztosít a Kie összes építési és futási idejéhez. Számos gyárat, szolgáltatást és közüzemi módszert kínál. Tehát először vegyük figyelembe a KieServices példa:

KieServices kieServices = KieServices.Factory.get ();

A KieServices segítségével új példányokat fogunk létrehozni KieFileSystem, KieBuilder, és KieContainer.

4.2. KieFileSystem

KieFileSystem egy virtuális fájlrendszer. Adjuk hozzá az Excel táblázatot:

Dt erőforrás = ResourceFactory .newClassPathResource ("com / baeldung / drools / rules / Discount.xls", getClass ()); KieFileSystem kieFileSystem = kieServices.newKieFileSystem (). Write (dt); 

4.3. KieBuilder

Most építsd fel a KieFileSystem azzal átadva KieBuilder:

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

Sikeres felépítés esetén létrehoz egy KieModule (bármely Maven által gyártott edény, benne egy kmodule.xml, a KieModule).

4.4. KieRepository

A keretrendszer automatikusan hozzáadja a KieModule (az összeállításból ered) KieRepository:

KieRepository kieRepository = kieServices.getRepository ();

4.5. KieContainer

Most már lehet újat létrehozni KieContainer ezzel KieModule annak használatával ReleaseId. Ebben az esetben Kie alapértelmezést rendel hozzá ReleaseId:

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

4.6. KieSession

Most megszerezhetjük KieSession tól KieContainer. Alkalmazásunk kölcsönhatásba lép a KieSession, amely tárolja és futtatja a futási adatokat:

KieSession kieSession = kieContainer.newKieSession ();

5. A szabályok végrehajtása

Végül itt az ideje a bemeneti adatok megadására és a szabályok érvényre juttatására:

Ügyfél vevő = új vásárló (CustomerType.BUSINESS, 2); kieSession.insert (ügyfél); kieSession.fireAllRules ();

6. Tesztesetek

Adjunk hozzá néhány tesztesetet:

public class DiscountExcelIntegrationTest {private KieSession kSession; @A nyilvános void beállítása előtt () {Resource dt = ResourceFactory .newClassPathResource ("com / baeldung / drools / rules / Discount.xls", getClass ()); kSession = új DroolsBeanFactory (). getKieSession (dt); } @Test public void giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount () dobja a Kivételt {Customer customer = new Customer (CustomerType.INDIVIDUAL, 5); kSession.insert (ügyfél); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 15); } @Test public void giveIndvidualRecent_whenFireRule_thenCorrectDiscount () dobja a Kivételt {Customer customer = new Customer (CustomerType.INDIVIDUAL, 1); kSession.insert (ügyfél); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 5); } @Test public void giveBusinessAny_whenFireRule_thenCorrectDiscount () dobja a Kivételt {Customer customer = new Customer (CustomerType.BUSINESS, 0); kSession.insert (ügyfél); kSession.fireAllRules (); assertEquals (customer.getDiscount (), 20); }}

7. Hibaelhárítás

A Drools a döntési táblázatot DRL-vé alakítja. Emiatt az Excel fájl hibáinak és elírási hibáinak kezelése nehéz lehet. A hibák gyakran a DRL tartalmára vonatkoznak. Tehát a hibaelhárításhoz segít kinyomtatni és elemezni a DRL-t:

Dt erőforrás = ResourceFactory .newClassPathResource ("com / baeldung / drools / rules / Discount.xls", getClass ()); DecisionTableProviderImpl decisionTableProvider = new DecisionTableProviderImpl (); Karaktersorozat drl = decisionTableProvider.loadFromResource (dt, null);

8. Következtetés

Ebben a cikkben egy gyors példát láthattunk a Drools használatáról az üzleti szabályok kezelésére egy Excel táblázatban. Láttuk a struktúrát és a minimális kulcsszavakat, amelyeket fel kell használni a szabályok meghatározásához egy Excel fájlban. Ezután a Kie összetevőket használtuk a szabályok elolvasására és bevetésére. Végül teszteseteket írtunk az eredmények igazolására.

Mint mindig, az ebben a cikkben használt példa megtalálható a Github projektben.