Drools Spring Integration

1. Introduksjon

I denne raske opplæringen skal vi integrere Drools med Spring. Hvis du nettopp har kommet i gang med Drools, kan du sjekke ut denne intro-artikkelen.

2. Maven-avhengigheter

La oss starte med å legge til følgende avhengigheter til vår pom.xml fil:

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

De siste versjonene finner du her for siklingskjerne og her for kie-spring.

3. Innledende data

La oss nå definere dataene som skal brukes i vårt eksempel. Vi skal beregne billettprisen på turen basert på tilbakelagt avstand og nattavgiftsflagget.

Her er et enkelt objekt som vil bli brukt som en Faktum:

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

La oss også definere et annet forretningsobjekt som skal brukes til å representere priser:

offentlig klasse Billettpris {privat Lang natt Tillegg; privat Long rideFare; // standard konstruktører, getters / setters}

La oss nå definere en forretningsregel for beregning av drosjetakster:

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

Som vi kan se, er en regel definert for å beregne den totale prisen for det gitte TaxiRide.

Denne regelen aksepterer a TaxiRide innvender og sjekker om isNightSurcharge attributt er falsk og distanceInMile attributtverdien er mindre enn 10, og beregn deretter billettprisen til 70 og setter nattTillegg eiendom til 0.

Den beregnede effekten er satt til Billettpris gjenstand for videre bruk.

4. Vårintegrasjon

4.1. Spring Bean Configuration

La oss nå gå videre til vårintegrasjonen.

Vi skal definere en konfigurasjonsklasse for vårbønne - som vil være ansvarlig for å sette i gang TaxiFareCalculatorService bønne og dens avhengighet:

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

KieServices er en singleton som fungerer som ett punktoppføring for å få alle tjenester levert av Kie. KieServices hentes med KieServices.Factory.get ().

Deretter må vi få KieContainer som er en plassholder for alt objektet vi trenger for å kjøre regelmotoren.

KieContainer er bygget ved hjelp av andre bønner inkludert KieFileSystem, KieBuilder, og KieModule.

La oss fortsette å lage en KieModule som er en beholder med alle ressursene som kreves for å definere regelkunnskap kjent som KieBase.

KieModule kieModule = kieBuilder.getKieModule ();

KieBase er et depot som inneholder all kunnskap relatert til applikasjonen, slik som regler, prosesser, funksjoner, typemodeller og den er gjemt inne KieModule. De KieBase kan fås fra KieContainer.

En gang KieModule er opprettet, kan vi fortsette å lage KieContainersom inneholder KieModule hvor i KieBase er definert. De KieContainer er opprettet ved hjelp av en modul:

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

4.2. Vårtjeneste

La oss definere en tjenesteklasse som utfører den faktiske forretningslogikken ved å sende den Faktum motsette seg motoren for å behandle resultatet:

@Service offentlig klasse TaxiFareCalculatorService {@Autowired private 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 (); }} 

Til slutt, a KieSession er opprettet ved hjelp av KieContainer forekomst. EN KieSession forekomst er et sted der inndata kan settes inn. De KieSession samhandler med motoren for å behandle den faktiske forretningslogikken som er definert i regel basert på innsatte fakta.

Global (akkurat som en global variabel) brukes til å overføre informasjon til motoren. Vi kan sette Global ved hjelp av setGlobal (“nøkkel”, verdi); i dette eksemplet har vi satt Billettpris motsette deg som Global å lagre den beregnede taxiprisen.

Som vi diskuterte i avsnitt 4, en Regel krever data å operere på. Vi setter inn Faktum inn i økt ved hjelp av kieSession.insert (taxiRide);

Når vi er ferdige med å sette opp inngangen Faktum, vi kan be motoren om å utføre forretningslogikken ved å ringe fireAllRules ().

Til slutt må vi rydde opp økten for å unngå minnelekkasje ved å ringe avhende () metode.

5. Eksempel i aksjon

Nå kan vi koble opp en vårkontekst og i handling se at Drools fungerer som forventet:

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

6. Konklusjon

I denne artikkelen lærte vi om Drools Spring-integrasjon med en enkel brukssak.

Som alltid er implementeringen av eksemplet og kodebiter tilgjengelig på GitHub.