Drools Spring-integratie

1. Inleiding

In deze korte tutorial gaan we Drools integreren met Spring. Als je net met Drools bent begonnen, bekijk dan dit intro-artikel.

2. Maven afhankelijkheden

Laten we beginnen met het toevoegen van de volgende afhankelijkheden aan onze pom.xml het dossier:

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

De laatste versies zijn hier te vinden voor drools-core en hier voor kie-spring.

3. Initiële gegevens

Laten we nu de gegevens definiëren die in ons voorbeeld zullen worden gebruikt. We gaan de ritprijs van een rit berekenen op basis van de afgelegde afstand en de vlag van de nachttoeslag.

Hier is een eenvoudig object dat zal worden gebruikt als een Feit:

openbare klasse TaxiRide {privé Boolean isNightSurcharge; privé Long distanceInMile; // standaard constructeurs, getters / setters}

Laten we ook een ander zakelijk object definiëren dat zal worden gebruikt voor het weergeven van tarieven:

openbare klasse Tarief {privé Lange nachtToeslag; privé Lange rit Tarief; // standaard constructeurs, getters / setters}

Laten we nu een zakelijke regel definiëren voor het berekenen van taxitarieven:

wereldwijde com.baeldung.spring.drools.model.Fare rideFare; dialect "mvel" rule "Bereken taxitarief - scenario 1" wanneer taxiRideInstance: TaxiRide (isNightSurcharge == false && distanceInMile <10); dan rideFare.setNightSurcharge (0); rideFare.setRideFare (70); einde 

Zoals we kunnen zien, is er een regel gedefinieerd om het totale tarief van het gegeven te berekenen TaxiRit.

Deze regel accepteert een TaxiRit object en controleert of het isNightSurcharge kenmerk is false en de distanceInMile attribuutwaarde is kleiner dan 10, bereken vervolgens het tarief als 70 en stelt de nacht Toeslag eigendom op 0.

De berekende output is ingesteld op Tarief object voor verder gebruik.

4. Lente-integratie

4.1. Spring Bean-configuratie

Laten we nu verder gaan met de Spring-integratie.

We gaan een Spring Bean-configuratieklasse definiëren - die verantwoordelijk is voor het instantiëren van het TaxiFareCalculatorService bean en zijn afhankelijkheden:

@Configuration @ComponentScan ("com.baeldung.spring.drools.service") openbare klasse TaxiFareConfiguration {privé statische laatste String drlFile = "TAXI_FARE_RULE.drl"; @Bean openbare 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 (); retour kieServices.newKieContainer (kieModule.getReleaseId ()); }} 

KieServices is een singleton die fungeert als een single point entry om alle services van Kie te krijgen. KieServices wordt opgehaald met KieServices.Factory.get ().

Vervolgens moeten we het KieContainer wat een tijdelijke aanduiding is voor al het object dat we nodig hebben om de rule engine uit te voeren.

KieContainer is gebouwd met behulp van andere bonen, waaronder KieFileSystem, KieBuilder, en KieModule.

Laten we doorgaan met het maken van een KieModule wat een container is van alle bronnen die nodig zijn om regelkennis te definiëren die bekend staat als KieBase.

KieModule kieModule = kieBuilder.getKieModule ();

KieBase is een repository die alle kennis met betrekking tot de applicatie bevat, zoals regels, processen, functies, typemodellen en het is erin verborgen KieModule. De KieBase kan worden verkregen bij de KieContainer.

Een keer KieModule is gemaakt, kunnen we doorgaan met het maken KieContainerdie de KieModule waar de KieBase is gedefinieerd. De KieContainer is gemaakt met behulp van een module:

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

4.2. Spring Service

Laten we een serviceklasse definiëren die de feitelijke bedrijfslogica uitvoert door de Feit bezwaar maken tegen de motor voor het verwerken van het resultaat:

@Service openbare klasse TaxiFareCalculatorService {@Autowired private KieContainer kieContainer; openbaar Lang berekenFare (TaxiRide taxiRide, Tarief rideFare) {KieSession kieSession = kieContainer.newKieSession (); kieSession.setGlobal ("rideFare", rideFare); kieSession.insert (taxiRide); kieSession.fireAllRules (); kieSession.dispose (); retour rideFare.getTotalFare (); }} 

Eindelijk een KieSession is gemaakt met KieContainer voorbeeld. EEN KieSession instantie is een plaats waar invoergegevens kunnen worden ingevoegd. De KieSession werkt samen met de motor om de feitelijke bedrijfslogica te verwerken die in de regel is gedefinieerd op basis van ingevoegde feiten.

Globaal (net als een globale variabele) wordt gebruikt om informatie door te geven aan de motor. We kunnen de Global instellen met setGlobal ("sleutel", waarde); in dit voorbeeld hebben we set Tarief object als Globaal om het berekende taxitarief op te slaan.

Zoals we hebben besproken in hoofdstuk 4, een Regel heeft gegevens nodig om te kunnen opereren. We voegen de Feit in sessie met kieSession.insert (taxiRide);

Zodra we klaar zijn met het instellen van de invoer Feit, we kunnen de motor vragen om de bedrijfslogica uit te voeren door te bellen fireAllRules ().

Ten slotte moeten we de sessie opschonen om geheugenlekken te voorkomen door het weggooien methode.

5. Voorbeeld in actie

Nu kunnen we een Spring-context bedraden en in actie zien dat Drools werkt zoals verwacht:

@Test openbare leegte whenNightSurchargeFalseAndDistLessThan10_thenFixWithoutNightSurcharge () {TaxiRide taxiRide = nieuwe TaxiRide (); taxiRide.setIsNightSurcharge (false); taxiRide.setDistanceInMile (9L); Tarief rideFare = nieuw tarief (); Lang totalCharge = taxiFareCalculatorService.calculateFare (taxiRide, rideFare); assertNotNull (totalCharge); assertEquals (Long.valueOf (70), totalCharge); }

6. Conclusie

In dit artikel hebben we geleerd over Drools Spring-integratie met een eenvoudige use-case.

Zoals altijd zijn de implementatie van het voorbeeld en de codefragmenten beschikbaar op GitHub.