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 KieContainer – amely 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.