Drools Spring Integration

1. Introduzione

In questo rapido tutorial, integreremo Drools con Spring. Se hai appena iniziato con Drools, dai un'occhiata a questo articolo introduttivo.

2. Dipendenze di Maven

Cominciamo aggiungendo le seguenti dipendenze al nostro file pom.xml :

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

Le ultime versioni possono essere trovate qui per drools-core e qui per kie-spring.

3. Dati iniziali

Definiamo ora i dati che verranno utilizzati nel nostro esempio. Calcoleremo la tariffa di una corsa in base alla distanza percorsa e alla bandiera del supplemento notturno.

Ecco un semplice oggetto che verrà utilizzato come Fatto:

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

Definiamo anche un altro oggetto business che verrà utilizzato per rappresentare le tariffe:

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

Ora definiamo una regola aziendale per il calcolo delle tariffe dei taxi:

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 

Come possiamo vedere, viene definita una regola per calcolare la tariffa totale di un determinato TaxiRide .

Questa regola accetta un oggetto TaxiRide e controlla se l' attributo isNightSurcharge è falso e il valore dell'attributo distanceInMile è inferiore a 10, quindi calcola la tariffa come 70 e imposta la proprietà nightSurcharge su 0.

L'output calcolato viene impostato sull'oggetto Fare per un ulteriore utilizzo.

4. Spring Integration

4.1. Configurazione Spring Bean

Ora, passiamo all'integrazione di Spring.

Definiremo una classe di configurazione del bean Spring, che sarà responsabile dell'istanza del bean TaxiFareCalculatorService e delle sue dipendenze:

@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 è un singleton che funge da punto di ingresso singolo per ottenere tutti i servizi forniti da Kie. KieServices viene recuperato utilizzando KieServices.Factory.get ().

Successivamente, dobbiamo ottenere il KieContainer che è un segnaposto per tutti gli oggetti di cui abbiamo bisogno per eseguire il motore delle regole.

KieContainer è costruito con l'aiuto di altri bean, inclusi KieFileSystem, KieBuilder e KieModule.

Procediamo con la creazione di un KieModule che è un contenitore di tutte le risorse necessarie per definire la conoscenza delle regole noto come KieBase.

KieModule kieModule = kieBuilder.getKieModule();

KieBase è un repository che contiene tutte le conoscenze relative all'applicazione come regole, processi, funzioni, modelli di tipo ed è nascosto all'interno di KieModule . Il KieBase può essere ottenuto dal KieContainer.

Una volta creato KieModule , possiamo procedere alla creazione di KieContainer , che contiene il KieModule in cui è stato definito KieBase . Il KieContainer viene creato utilizzando un modulo:

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

4.2. Servizio primaverile

Definiamo una classe di servizio che esegue l'effettiva logica di business passando l' oggetto Fact al motore per l'elaborazione del risultato:

@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(); } } 

Infine, viene creata una KieSession utilizzando l' istanza KieContainer . Un KieSession esempio è un luogo dove si possono inserire dati di input. La KieSession interagisce con il motore per elaborare l'effettiva logica di business definita nella regola basata sui Fatti inseriti.

Global (proprio come una variabile globale) viene utilizzata per passare le informazioni al motore. Possiamo impostare il Global usando setGlobal ("key", value); in questo esempio, abbiamo impostato l' oggetto Fare come Globale per memorizzare la tariffa del taxi calcolata.

Come abbiamo discusso nella sezione 4, una regola richiede dati su cui operare . Stiamo inserendo il Fatto nella sessione usando kieSession .insert (taxiRide);

Una volta che abbiamo finito di impostare l'input Fact, possiamo richiedere al motore di eseguire la logica di business chiamando fireAllRules ().

Infine, dobbiamo ripulire la sessione per evitare perdite di memoria chiamando il metodo dispose () .

5. Esempio in azione

Ora possiamo collegare un contesto primaverile e vedere in azione che Drools funziona come previsto:

@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. Conclusione

In questo articolo, abbiamo appreso l'integrazione di Drools Spring con un semplice caso d'uso.

Come sempre, l'implementazione dell'esempio e gli snippet di codice sono disponibili su GitHub.