Drools tavaszi integráció

1. Bemutatkozás

Ebben a gyors bemutatóban integrálni fogjuk a Drools-ot Springbe. Ha most kezdi a Drools használatát, nézze meg ezt a bevezető cikket.

2. Maven-függőségek

Kezdjük azzal, hogy a következő függőségeket adjuk hozzá pom.xml fájl:

 org.drools drools-core 7.0.0.Final org.kie kie-spring 7.0.0.Final 

A legújabb verziók itt találhatók a drools-core és itt a kie-spring esetében.

3. Kezdeti adatok

Most határozzuk meg a példánkban felhasználandó adatokat. Kiszámítjuk egy utazás viteldíját a megtett távolság és az éjszakai pótdíj zászló alapján.

Itt van egy egyszerű objektum, amelyet a-ként fogunk használni Tény:

nyilvános osztály TaxiRide {privát logikai isNightSurcharge; magán távolságiInMile; // szabványos kivitelezők, szerelők / beállítók}

Adjon meg egy másik üzleti objektumot is, amelyet a viteldíjak ábrázolására használnak:

nyilvános osztály Viteldíj {magán Hosszú éjszakaPótdíj; privát Long rideFare; // szabványos kivitelezők, szerelők / beállítók}

Most határozzunk meg egy üzleti szabályt a taxidíjak kiszámításához:

globális com.baeldung.spring.drools.model.Fare rideFare; dialektus "mvel" szabály "Taxi viteldíj kiszámítása - 1. eset", amikor taxiRideInstance: TaxiRide (isNightSurcharge == false && distanceInMile <10); akkor rideFare.setNightSurcharge (0); rideFare.setRideFare (70); vége 

Mint láthatjuk, meghatározunk egy szabályt az adott teljes viteldíj kiszámításához TaxiRide.

Ez a szabály elfogadja a TaxiRide objektumot és ellenőrzi, hogy a isNightSurcharge attribútum az hamis és a distanceInMile attribútum értéke kisebb, mint 10, akkor számítsa ki a viteldíjat 70-nek, és állítsa be a nightPótdíj tulajdonság 0-ra.

A kiszámított teljesítmény értéke Viteldíj tárgy további felhasználásra.

4. Tavaszi integráció

4.1. Tavaszi bab konfiguráció

Most térjünk át a tavaszi integrációra.

Meghatározzuk a Spring bab konfigurációs osztályt, amely felelős lesz a TaxiFareCalculatorService bab és függőségei:

@Configuration @ComponentScan ("com.baeldung.spring.drools.service") nyilvános osztály TaxiFareConfiguration {private static final String drlFile = "TAXI_FARE_RULE.drl"; @Bean public KieContainer kieContainer () {KieServices kieServices = KieServices.Factory.get (); KieFileSystem kieFileSystem = kieServices.newKieFileSystem (); kieFileSystem.write (ResourceFactory.newClassPathResource (drlFile)); KieBuilder kieBuilder = kieServices.newKieBuilder (kieFileSystem); kieBuilder.buildAll (); KieModule kieModule = kieBuilder.getKieModule (); return kieServices.newKieContainer (kieModule.getReleaseId ()); }} 

KieServices egy szingulett, amely egyetlen pontként működik, hogy a Kie által nyújtott összes szolgáltatást megkapja. KieServices segítségével lekérhető KieServices.Factory.get ().

Ezután meg kell szereznünk a KieContainer amely a szabálymotor futtatásához szükséges összes objektum helyőrzője.

KieContainer más bab segítségével épül, beleértve KieFileSystem, KieBuilder, és KieModule.

Folytassuk a KieModule amely az összes erőforrás tárolója, amelyek szükségesek az úgynevezett szabályismeretek meghatározásához KieBase.

KieModule kieModule = kieBuilder.getKieModule ();

KieBase egy olyan adattár, amely tartalmazza az alkalmazással kapcsolatos összes tudást, például szabályokat, folyamatokat, függvényeket, típusmodelleket, és el van rejtve benne KieModule. A KieBase beszerezhető a KieContainer.

Egyszer KieModule létrejön, folytathatjuk a létrehozást KieContaineramely tartalmazza a KieModule hol a KieBase meghatározták. A KieContainer modul segítségével jön létre:

KieContainer kContainer = kieServices.newKieContainer (kieModule.getReleaseId ());

4.2. Tavaszi istentisztelet

Határozzunk meg egy olyan szolgáltatási osztályt, amely a tényleges üzleti logikát a Tény kifogásolni a motort az eredmény feldolgozásához:

@Service public class TaxiFareCalculatorService {@Autowired private KieContainer kieContainer; public Hosszú calcFare (TaxiRide taxiRide, Fare rideFare) {KieSession kieSession = kieContainer.newKieSession (); kieSession.setGlobal ("rideFare", rideFare); kieSession.insert (taxiRide); kieSession.fireAllRules (); kieSession.dispose (); return rideFare.getTotalFare (); }} 

Végül a KieSession segítségével jön létre KieContainer példa. A KieSession a példány olyan hely, ahová a bemeneti adatokat be lehet illeszteni. A KieSession kölcsönhatásban van a motorral a szabályban meghatározott tényleges üzleti logika feldolgozására a beillesztett tények alapján.

Globális (csakúgy, mint egy globális változó) arra szolgál, hogy információkat továbbítson a motorba. A Globális segítségével beállíthatjuk setGlobal („kulcs”, érték); ebben a példában beállítottuk Viteldíj objektum globálisként a kiszámított taxi viteldíj tárolására.

Amint a 4. szakaszban tárgyaltuk, a Szabály adatok működéséhez szükséges. Betesszük a Tény munkamenet használatával kieSession.helyezze be (taxiRide);

Miután végeztünk a bemenet beállításával Tény, kérhetjük a motort az üzleti logika végrehajtására hívással fireAllRules ().

Végül meg kell tisztítanunk a munkamenetet, hogy elkerüljük a memória szivárgását a eldob() módszer.

5. Példa a működésben

Most összeköthetjük a tavaszi kontextust, és működés közben láthatjuk, hogy a Drools a várt módon működik:

@Test public void whenNightSurchargeFalseAndDistLessThan10_thenFixWithoutNightSurcharge () {TaxiRide taxiRide = new TaxiRide (); taxiRide.setIsNightSurcharge (hamis); taxiRide.setDistanceInMile (9L); Viteldíj = = új viteldíj (); Long totalCharge = taxiFareCalculatorService.calculateFare (taxiRide, rideFare); assertNotNull (totalCharge); assertEquals (Long.valueOf (70), totalCharge); }

6. Következtetés

Ebben a cikkben megismerhettük a Drools Spring integrációját egy egyszerű használati esettel.

Mint mindig, a példa és a kódrészletek megvalósítása elérhető a GitHubon.