Intégration de Drools Spring

1. Introduction

Dans ce rapide tutoriel, nous allons intégrer Drools à Spring. Si vous ne faites que commencer avec Drools, consultez cet article d'introduction.

2. Dépendances de Maven

Commençons par ajouter les dépendances suivantes à notre fichier pom.xml :

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

Les dernières versions peuvent être trouvées ici pour drools-core et ici pour kie-spring.

3. Données initiales

Définissons maintenant les données qui seront utilisées dans notre exemple. Nous allons calculer le tarif d'un trajet en fonction de la distance parcourue et du drapeau de supplément de nuit.

Voici un objet simple qui sera utilisé comme un fait:

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

Définissons également un autre objet métier qui sera utilisé pour représenter les tarifs:

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

Maintenant, définissons une règle métier pour le calcul des tarifs de 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 

Comme nous pouvons le voir, une règle est définie pour calculer le prix total du TaxiRide donné .

Cette règle accepte un objet TaxiRide et vérifie si l' attribut isNightSurcharge est faux et si la valeur de l'attribut distanceInMile est inférieure à 10, puis calcule le tarif comme 70 et définit la propriété nightSurcharge sur 0.

La sortie calculée est définie sur Objet tarif pour une utilisation ultérieure.

4. Intégration de printemps

4.1. Configuration de Spring Bean

Passons maintenant à l'intégration Spring.

Nous allons définir une classe de configuration du bean Spring - qui sera responsable de l'instanciation du bean TaxiFareCalculatorService et de ses dépendances:

@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 est un singleton qui agit comme un point d'entrée unique pour obtenir tous les services fournis par Kie. KieServices est récupéré à l'aide de KieServices.Factory.get ().

Ensuite, nous devons obtenir le KieContainer qui est un espace réservé pour tous les objets dont nous avons besoin pour exécuter le moteur de règles.

KieContainer est construit à l'aide d'autres beans, notamment KieFileSystem, KieBuilder et KieModule.

Commençons par créer un KieModule qui est un conteneur de toutes les ressources nécessaires pour définir la connaissance des règles connue sous le nom de KieBase.

KieModule kieModule = kieBuilder.getKieModule();

KieBase est un référentiel qui contient toutes les connaissances liées à l'application telles que les règles, les processus, les fonctions, les modèles de type et il est caché dans KieModule . Le KieBase peut être obtenu à partir du KieContainer.

Une fois KieModule créé, nous pouvons procéder à la création de KieContainer - qui contient le KieModule où le KieBase a été défini. Le KieContainer est créé à l'aide d'un module:

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

4.2. Service de printemps

Définissons une classe de service qui exécute la logique métier réelle en passant l' objet Fact au moteur pour traiter le résultat:

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

Enfin, un KieSession est créé à l'aide de l' instance KieContainer . Une instance KieSession est un endroit où les données d'entrée peuvent être insérées. Le KieSession interagit avec le moteur pour traiter la logique métier réelle définie dans la règle en fonction des faits insérés.

Global (tout comme une variable globale) est utilisé pour transmettre des informations au moteur. Nous pouvons définir le Global en utilisant setGlobal («clé», valeur); dans cet exemple, nous avons défini l' objet Fare comme Global pour stocker le tarif de taxi calculé.

Comme nous l'avons vu dans la section 4, une règle nécessite des données pour fonctionner . Nous insérons le Fact dans la session en utilisant kieSession .insert (taxiRide);

Une fois que nous avons terminé la configuration de l'entrée Fact, nous pouvons demander au moteur d'exécuter la logique métier en appelant fireAllRules ().

Enfin, nous devons nettoyer la session pour éviter les fuites de mémoire en appelant la méthode dispose () .

5. Exemple en action

Maintenant, nous pouvons câbler un contexte Spring et voir en action que Drools fonctionne comme prévu:

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

Dans cet article, nous avons découvert l'intégration de Drools Spring avec un cas d'utilisation simple.

Comme toujours, l'implémentation de l'exemple et les extraits de code sont disponibles à l'adresse over sur GitHub.