Jarná integrácia Drools

1. Úvod

V tomto rýchlom výučbe sa chystáme integrovať Drools s Spring. Ak s Droolsom ešte len začínate, pozrite si tento úvodný článok.

2. Maven závislosti

Začnime tým, že k našej pridáme nasledujúce závislosti pom.xml spis:

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

Najnovšie verzie nájdete tu pre drools-core a tu pre kie-spring.

3. Počiatočné údaje

Poďme si teraz definovať údaje, ktoré sa použijú v našom príklade. Ideme vypočítať cestovné na základe prejdenej vzdialenosti a vlajky nočného príplatku.

Tu je jednoduchý objekt, ktorý sa použije ako Skutočnosť:

verejná trieda TaxiRide {private Boolean isNightSurcharge; private Long distanceInMile; // štandardné konštruktory, getre / setre}

Definujme tiež ďalší obchodný objekt, ktorý sa použije na predstavovanie cestovného:

public class Fare {private Long nightSurcharge; súkromná dlhá jazda; // štandardné konštruktory, getre / setre}

Teraz definujme obchodné pravidlo pre výpočet cestovného taxíkom:

global com.baeldung.spring.drools.model.Fare rideFare; pravidlo "dialekt" dialektu "Vypočítať cestovné taxíkom - scenár 1", keď taxiRideInstance: TaxiRide (isNightSurcharge == false && distanceInMile <10); potom rideFare.setNightSurcharge (0); rideFare.setRideFare (70); koniec 

Ako vidíme, je definované pravidlo na výpočet celkového cestovného daného TaxiRide.

Toto pravidlo prijíma a TaxiRide objekt a skontroluje, či isNightSurcharge atribút je nepravdivé a distanceInMile Hodnota atribútu je menšia ako 10, potom vypočítajte cestovné ako 70 a nastavíte nocPoplatok majetok na 0.

Vypočítaný výstup je nastavený na Cestovné objekt na ďalšie použitie.

4. Jarná integrácia

4.1. Konfigurácia Spring Bean

Prejdime teraz k jarnej integrácii.

Budeme definovať konfiguračnú triedu Spring bean - ktorá bude zodpovedná za vytvorenie inštancie TaxiFareCalculatorService fazuľa a jej závislosti:

@Configuration @ComponentScan ("com.baeldung.spring.drools.service") verejná trieda 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 (); návrat kieServices.newKieContainer (kieModule.getReleaseId ()); }} 

KieServices je singleton, ktorý slúži ako jeden bod a získava všetky služby poskytované spoločnosťou Kie. KieServices je načítaný pomocou KieServices.Factory.get ().

Ďalej musíme získať KieContainer čo je zástupný symbol pre všetky objekty, ktoré potrebujeme na spustenie pravidla.

KieContainer sa vyrába pomocou iných fazúľ vrátane KieFileSystem, KieBuilder, a KieModule.

Poďme k vytvoreniu a KieModule ktorý je zásobníkom všetkých zdrojov potrebných na definovanie znalostí o pravidle známych ako KieBase.

KieModule kieModule = kieBuilder.getKieModule ();

KieBase je úložisko, ktoré obsahuje všetky poznatky súvisiace s aplikáciou, ako sú pravidlá, procesy, funkcie, typové modely, a je skryté vo vnútri KieModule. The KieBase možno získať z KieContainer.

Raz KieModule je vytvorené, môžeme pristúpiť k vytvoreniu KieContainerktorý obsahuje KieModule kde KieBase bol definovaný. The KieContainer sa vytvára pomocou modulu:

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

4.2. Jarná bohoslužba

Poďme definovať triedu služieb, ktorá vykonáva skutočnú obchodnú logiku odovzdaním znaku Fakt vzniesť námietku proti motoru na spracovanie výsledku:

@ Verejná trieda služieb TaxiFareCalculatorService {@Autowired private KieContainer kieContainer; public Long CalcFare (TaxiRide taxiRide, Fare rideFare) {KieSession kieSession = kieContainer.newKieSession (); kieSession.setGlobal ("rideFare", rideFare); kieSession.insert (taxiRide); kieSession.fireAllRules (); kieSession.dispose (); return rideFare.getTotalFare (); }} 

Nakoniec a KieSession sa vytvára pomocou KieContainer inštancia. A KieSession inštancia je miesto, do ktorého je možné vkladať vstupné údaje. The KieSession interaguje s motorom a spracováva skutočnú obchodnú logiku definovanú v pravidle na základe vložených faktov.

Globálna (rovnako ako globálna premenná) sa používa na prenos informácií do motora. Globálny môžeme nastaviť pomocou setGlobal („kľúč“, hodnota); v tomto príklade sme nastavili Cestovné objekt ako globálny na uloženie vypočítaného cestovného taxíkom.

Ako sme diskutovali v časti 4, a Pravidlo vyžaduje, aby údaje fungovali. Vkladáme Fakt do relácie pomocou kieSession.vloženie (taxiRide);

Keď skončíme s nastavovaním vstupu Skutočnosť, môžeme požiadať motor, aby vykonal obchodnú logiku volaním fireAllRules ().

Nakoniec musíme reláciu vyčistiť, aby sme zabránili úniku pamäte volaním súboru disponovať () metóda.

5. Príklad v akcii

Teraz môžeme prepojiť jarný kontext a vidieť v akcii, že Drools funguje podľa očakávania:

@Test public void whenNightSurchargeFalseAndDistLessThan10_thenFixWithoutNightSurcharge () {TaxiRide taxiRide = nový TaxiRide (); taxiRide.setIsNightSurcharge (false); taxiRide.setDistanceInMile (9L); Fare rideFare = nové Fare (); Long totalCharge = taxiFareCalculatorService.calculateFare (taxiRide, rideFare); assertNotNull (totalCharge); assertEquals (Long.valueOf (70), totalCharge); }

6. Záver

V tomto článku sme sa dozvedeli o integrácii Drools Spring s jednoduchým prípadom použitia.

Implementácia príkladu a útržkov kódu sú ako vždy k dispozícii na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found