Drools Proljetna integracija

1. Uvod

U ovom brzom vodiču integrirat ćemo Drools s Springom. Ako tek započinjete s Droolsima, pogledajte ovaj uvodni članak.

2. Ovisnosti Mavena

Počnimo dodavanjem sljedećih ovisnosti u našu pom.xml datoteka:

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

Najnovije verzije možete pronaći ovdje za drools-core i ovdje za kie-spring.

3. Početni podaci

Definirajmo sada podatke koji će se koristiti u našem primjeru. Izračunati ćemo cijenu vožnje na temelju prijeđene udaljenosti i zastave noćne nadoplate.

Evo jednostavnog predmeta koji će se koristiti kao Činjenica:

javna klasa TaxiRide {private Boolean isNightSurcharge; privatni Long distanceInMile; // standardni konstruktori, getteri / postavljači}

Definirajmo i drugi poslovni objekt koji će se koristiti za predstavljanje cijena:

javna klasa Fare {private Long nightSercharge; privatno Long rideFare; // standardni konstruktori, getteri / postavljači}

Sada, definirajmo poslovno pravilo za izračun taksi cijena:

globalni com.baeldung.spring.drools.model.Fare rideFare; dijalektalno pravilo "mvel" "Izračunaj cijenu taksija - scenarij 1" kada taxiRideInstance: TaxiRide (isNightSurcharge == false && distanceInMile <10); zatim rideFare.setNightSurcharge (0); rideFare.setRideFare (70); kraj 

Kao što vidimo, definirano je pravilo za izračun ukupne cijene danog TaxiRide.

Ovo pravilo prihvaća a TaxiRide objekt i provjerava je li isNightSarcharge atribut je lažno i distanceInMile vrijednost atributa manja je od 10, a zatim izračunajte cijenu kao 70 i postavite noćNadplata svojstvo na 0.

Izračunati izlaz postavljen je na Cijena karte objekt za daljnju upotrebu.

4. Proljetna integracija

4.1. Konfiguracija proljetnog graha

Idemo sada na integraciju Proljeća.

Definirat ćemo klasu Spring bean konfiguracije - koja će biti odgovorna za instanciranje TaxiFareCalculatorService grah i njegove ovisnosti:

@Configuration @ComponentScan ("com.baeldung.spring.drools.service") javna klasa 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 (); vratiti kieServices.newKieContainer (kieModule.getReleaseId ()); }} 

KieServices je singleton koji djeluje kao jedinstveni unos za dobivanje svih usluga koje pruža Kie. KieServices se preuzima pomoću KieServices.Factory.get ().

Dalje, moramo dobiti KieContainer koji je rezervirano mjesto za sve objekte koji su nam potrebni za pokretanje mehanizma pravila.

KieContainer gradi se uz pomoć drugih graha uključujući KieFileSystem, KieBuilder, i KieModule.

Nastavimo s izradom a KieModule koji je spremnik svih resursa koji su potrebni za definiranje znanja o pravilu poznatog kao KieBase.

KieModule kieModule = kieBuilder.getKieModule ();

KieBase je spremište koje sadrži sve znanje vezano uz aplikaciju, poput pravila, procesa, funkcija, tipskih modela i skriveno je u njemu KieModule. The KieBase mogu se dobiti iz KieContainer.

Jednom KieModule je stvoreno, možemo nastaviti stvarati KieContainerkoji sadrži KieModule gdje je KieBase je definirano. The KieContainer izrađuje se pomoću modula:

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

4.2. Proljetna služba

Definirajmo klasu usluge koja izvršava stvarnu poslovnu logiku prosljeđivanjem Činjenica prigovoriti motoru za obradu rezultata:

@Service javna klasa TaxiFareCalculatorService {@Autowired private KieContainer kieContainer; javni Long izračunajFare (TaxiRide taxiRide, Fare rideFare) {KieSession kieSession = kieContainer.newKieSession (); kieSession.setGlobal ("rideFare", rideFare); kieSession.insert (taxiRide); kieSession.fireAllRules (); kieSession.dispose (); povratak rideFare.getTotalFare (); }} 

Konačno, a KieSession izrađuje se pomoću KieContainer primjer. A KieSession instanca je mjesto gdje se mogu umetnuti ulazni podaci. The KieSession komunicira s motorom radi obrade stvarne poslovne logike definirane u pravilu na temelju umetnutih činjenica.

Globalno (baš kao i globalna varijabla) koristi se za prijenos podataka u motor. Globalno možemo postaviti pomoću setGlobal ("ključ", vrijednost); u ovom smo primjeru postavili Cijena karte objekt kao Global za pohranu izračunate cijene taksija.

Kao što smo raspravljali u odjeljku 4, a Pravilo zahtijeva podatke za rad. Umetamo Činjenica u sesiju koristeći kieSession.insert (taxiRide);

Kad završimo s postavljanjem ulaza Činjenica, možemo zatražiti da motor izvrši poslovnu logiku pozivanjem fireAllRules ().

Napokon, moramo očistiti sesiju kako bismo izbjegli curenje memorije pozivanjem raspolagati() metoda.

5. Primjer na djelu

Sada možemo povezati proljetni kontekst i vidjeti na djelu da Drools radi kako se očekivalo:

@Test javna void whenNightSurchargeFalseAndDistLessThan10_thenFixWithoutNightSurcharge () {TaxiRide taxiRide = novi TaxiRide (); taxiRide.setIsNightSarcharge (netačno); taxiRide.setDistanceInMile (9L); Vožnja za cijenuFare = nova cijena (); Long totalCharge = taxiFareCalculatorService.calculateFare (taxiRide, rideFare); assertNotNull (totalCharge); assertEquals (Long.valueOf (70), totalCharge); }

6. Zaključak

U ovom smo članku saznali o integraciji Drools Spring s jednostavnim slučajem upotrebe.

Kao i uvijek, implementacija primjera i isječci koda dostupni su na GitHubu.