Drools Spring Integration

1. Introduktion

I denne hurtige vejledning skal vi integrere Drools med Spring. Hvis du lige er kommet i gang med Drools, skal du tjekke denne intro-artikel.

2. Maven-afhængigheder

Lad os starte med at tilføje følgende afhængigheder til vores pom.xml fil:

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

De nyeste versioner kan findes her for drools-core og her for kie-spring.

3. Indledende data

Lad os nu definere de data, der vil blive brugt i vores eksempel. Vi beregner billetprisen for en tur baseret på den tilbagelagte afstand og nattetillægsflagget.

Her er et simpelt objekt, der vil blive brugt som en Faktum:

offentlig klasse TaxiRide {privat boolsk isNightSurcharge; privat LangdistanceInMile; // standard konstruktører, getters / setters}

Lad os også definere et andet forretningsobjekt, der vil blive brugt til at repræsentere billetpriser:

Billetpris til offentlig klasse {privat Lang natTillæg; privat Lang rideFare; // standard konstruktører, getters / setters}

Lad os nu definere en forretningsregel til beregning af taxa:

global com.baeldung.spring.drools.model.Fare rideFare; dialekt "mvel" -regel "Beregn taxapris - Scenarie 1", når taxiRideInstance: TaxiRide (isNightSurcharge == false && distanceInMile <10); derefter rideFare.setNightSurcharge (0); rideFare.setRideFare (70); ende 

Som vi kan se, defineres en regel til at beregne den samlede billetpris for det givne TaxiRide.

Denne regel accepterer a TaxiRide gør indsigelse og kontrollerer, om isNightSurcharge attribut er falsk og distanceInMile attributværdi er mindre end 10, beregn derefter billetprisen som 70 og indstil natTillæg ejendom til 0.

Den beregnede output er indstillet til Billetpris genstand til yderligere brug.

4. Integration af foråret

4.1. Spring Bean Configuration

Lad os nu gå videre til forårets integration.

Vi definerer en konfigurationsklasse for Spring Bean - som er ansvarlig for at starte TaxiFareCalculatorService bønne og dens afhængigheder:

@Configuration @ComponentScan ("com.baeldung.spring.drools.service") offentlig klasse TaxiFareConfiguration {privat statisk endelig String drlFile = "TAXI_FARE_RULE.drl"; @Bean offentlig 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 (); returner kieServices.newKieContainer (kieModule.getReleaseId ()); }} 

KieServices er en singleton, der fungerer som et enkelt punkt for at få alle tjenester leveret af Kie. KieServices hentes ved hjælp af KieServices.Factory.get ().

Dernæst skal vi hente KieContainer som er en pladsholder for alt det objekt, som vi har brug for for at køre regelmotoren.

KieContainer er bygget ved hjælp af andre bønner inklusive KieFileSystem, KieBuilder, og KieModule.

Lad os fortsætte med at oprette en KieModule som er en beholder med alle de ressourcer, der kræves for at definere regelviden kendt som KieBase.

KieModule kieModule = kieBuilder.getKieModule ();

KieBase er et lager, der indeholder al viden relateret til applikationen, såsom regler, processer, funktioner, typemodeller, og den er skjult inde KieModule. Det KieBase kan fås fra KieContainer.

Enkelt gang KieModule er oprettet, kan vi fortsætte med at skabe KieContainersom indeholder KieModule hvor er KieBase er defineret. Det KieContainer oprettes ved hjælp af et modul:

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

4.2. Spring Service

Lad os definere en serviceklasse, der udfører den faktiske forretningslogik ved at videregive Faktum modsætter sig motoren til behandling af resultatet:

@Service offentlig klasse TaxiFareCalculatorService {@Autowired privat KieContainer kieContainer; offentlig Lang beregneFare (TaxiRide taxiRide, Fare rideFare) {KieSession kieSession = kieContainer.newKieSession (); kieSession.setGlobal ("rideFare", rideFare); kieSession.insert (taxiRide); kieSession.fireAllRules (); kieSession.dispose (); return rideFare.getTotalFare (); }} 

Endelig a KieSession oprettes ved hjælp af KieContainer eksempel. EN KieSession eksempel er et sted, hvor inputdata kan indsættes. Det KieSession interagerer med motoren for at behandle den faktiske forretningslogik, der er defineret i regel baseret på indsatte fakta.

Global (ligesom en global variabel) bruges til at videregive oplysninger til motoren. Vi kan indstille det globale ved hjælp af setGlobal ("nøgle", værdi); i dette eksempel har vi sat Billetpris modsætter som Global at gemme den beregnede taxa.

Som vi diskuterede i afsnit 4, -en Herske kræver data til at fungere på. Vi indsætter Faktum ind i sessionen ved hjælp af kieSession.indsats (taxaride);

Når vi er færdige med at opsætte input Faktum, vi kan anmode motoren om at udføre forretningslogikken ved at ringe fireAllRules ().

Endelig er vi nødt til at rydde op i sessionen for at undgå hukommelseslækage ved at ringe til bortskaffe () metode.

5. Eksempel i aktion

Nu kan vi oprette en forårssammenhæng og se i aktion, at Drools fungerer som forventet:

@Test offentlig ugyldig nårNightSurchargeFalseAndDistLessThan10_thenFixWithoutNightSurcharge () {TaxiRide taxiRide = ny TaxiRide (); taxiRide.setIsNightSurcharge (false); taxiRide.setDistanceInMile (9L); Fare rideFare = ny billetpris (); Lang totalCharge = taxiFareCalculatorService.calculateFare (taxiRide, rideFare); assertNotNull (totalCharge); assertEquals (Long.valueOf (70), totalCharge); }

6. Konklusion

I denne artikel lærte vi om Drools Spring-integration med en simpel brugssag.

Som altid er implementeringen af ​​eksemplet og kodestykker tilgængelige på GitHub.


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