Drools Spring Integration

1. Einleitung

In diesem kurzen Tutorial werden wir Drools in Spring integrieren. Wenn Sie gerade erst mit Drools beginnen, lesen Sie diesen Intro-Artikel.

2. Maven-Abhängigkeiten

Beginnen wir mit dem Hinzufügen der folgenden Abhängigkeiten zu unserer Datei pom.xml :

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

Die neuesten Versionen finden Sie hier für Drools-Core und hier für Kie-Spring.

3. Anfangsdaten

Definieren wir nun die Daten, die in unserem Beispiel verwendet werden. Wir berechnen den Fahrpreis einer Fahrt basierend auf der zurückgelegten Strecke und der Nachtzuschlag-Flagge.

Hier ist ein einfaches Objekt, das als Fakt verwendet wird:

public class TaxiRide { private Boolean isNightSurcharge; private Long distanceInMile; // standard constructors, getters/setters }

Definieren wir auch ein anderes Geschäftsobjekt, das zur Darstellung von Tarifen verwendet wird:

public class Fare { private Long nightSurcharge; private Long rideFare; // standard constructors, getters/setters }

Definieren wir nun eine Geschäftsregel für die Berechnung der Taxikosten:

global com.baeldung.spring.drools.model.Fare rideFare; dialect "mvel" rule "Calculate Taxi Fare - Scenario 1" when taxiRideInstance:TaxiRide(isNightSurcharge == false && distanceInMile < 10); then rideFare.setNightSurcharge(0); rideFare.setRideFare(70); end 

Wie wir sehen können, wird eine Regel definiert, um den Gesamtpreis der gegebenen Taxifahrt zu berechnen .

Diese Regel akzeptiert ein TaxiRide- Objekt und prüft, ob das Attribut isNightSurcharge falsch und der Attributwert distanceInMile kleiner als 10 ist. Berechnen Sie dann den Tarif als 70 und setzen Sie die Eigenschaft nightSurcharge auf 0.

Die berechnete Ausgabe wird zur weiteren Verwendung auf das Tarifobjekt gesetzt .

4. Federintegration

4.1. Spring Bean Konfiguration

Fahren wir nun mit der Spring-Integration fort.

Wir werden eine Spring-Bean-Konfigurationsklasse definieren, die für die Instanziierung der TaxiFareCalculatorService- Bean und ihrer Abhängigkeiten verantwortlich ist:

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

KieServices ist ein Singleton, der als Einzelpunkteintrag fungiert, um alle von Kie bereitgestellten Dienste abzurufen. KieServices wird mit KieServices.Factory.get () abgerufen .

Als nächstes müssen wir den KieContainer abrufen, der ein Platzhalter für alle Objekte ist, die wir zum Ausführen der Regelengine benötigen.

KieContainer wird mit Hilfe anderer Beans wie KieFileSystem, KieBuilder und KieModule erstellt.

Lassen Sie uns fortfahren, ein KieModule zu erstellen, das einen Container mit allen Ressourcen enthält, die zum Definieren des als KieBase bekannten Regelwissens erforderlich sind .

KieModule kieModule = kieBuilder.getKieModule();

KieBase ist ein Repository, das alle mit der Anwendung verbundenen Kenntnisse wie Regeln, Prozesse, Funktionen und Typmodelle enthält und in KieModule versteckt ist . Die KieBase ist beim KieContainer erhältlich.

Sobald KieModule erstellt wird, können wir fortfahren erstellen KieContainer - , die das enthält KieModule wo die KieBase definiert wurde. Der KieContainer wird mit einem Modul erstellt:

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

4.2. Frühlingsservice

Definieren wir eine Serviceklasse, die die eigentliche Geschäftslogik ausführt, indem das Fact- Objekt zur Verarbeitung des Ergebnisses an die Engine übergeben wird:

@Service public class TaxiFareCalculatorService { @Autowired private KieContainer kieContainer; public Long calculateFare(TaxiRide taxiRide, Fare rideFare) { KieSession kieSession = kieContainer.newKieSession(); kieSession.setGlobal("rideFare", rideFare); kieSession.insert(taxiRide); kieSession.fireAllRules(); kieSession.dispose(); return rideFare.getTotalFare(); } } 

Schließlich wird eine KieSession mit der KieContainer- Instanz erstellt. Eine KieSession- Instanz ist ein Ort, an dem Eingabedaten eingefügt werden können. Die KieSession interagiert mit der Engine, um die tatsächliche Geschäftslogik zu verarbeiten, die in der Regel basierend auf eingefügten Fakten definiert ist.

Global (genau wie eine globale Variable) wird verwendet, um Informationen an die Engine zu übergeben. Wir können den Global mit setGlobal ("Schlüssel", Wert) setzen; In diesem Beispiel haben wir das Tarifobjekt als Global festgelegt, um den berechneten Taxipreis zu speichern.

Wie wir in Abschnitt 4 besprochen haben, erfordert eine Regel, dass Daten verarbeitet werden . Wir fügen den Fakt mit kieSession .insert (TaxiRide) in die Sitzung ein .

Sobald wir mit dem Einrichten des Eingabefaktors fertig sind , können wir die Engine auffordern, die Geschäftslogik auszuführen, indem wir fireAllRules () aufrufen .

Schließlich müssen wir die Sitzung bereinigen, um Speicherverluste durch Aufrufen der dispose () -Methode zu vermeiden .

5. Beispiel in Aktion

Jetzt können wir einen Spring-Kontext verkabeln und in Aktion sehen, dass Drools wie erwartet funktioniert:

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

6. Fazit

In diesem Artikel haben wir die Integration von Drools Spring anhand eines einfachen Anwendungsfalls kennengelernt.

Wie immer ist die Implementierung der Beispiel- und Codefragmente auf GitHub verfügbar.