Intégration Drools Spring

Intégration Drools Spring

1. introduction

Dans ce rapide tutoriel, nous allons intégrer Drools à Spring. Si vous commencez à peine avec Drools,check out this intro article.

2. Dépendances Maven

Commençons par ajouter les dépendances suivantes à notre fichierpom.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 pourdrools-core et ici pourkie-spring.

3. Donnée initiale

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 unFact:

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.example.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 tarif total desTaxiRide donnés.

Cette règle accepte un objetTaxiRide et vérifie si l'attributisNightSurcharge estfalse et la valeur d'attributdistanceInMile est inférieure à 10, puis calcule le tarif comme 70 et définit lenightSurcharge propriété à 0.

La sortie calculée est définie sur l'objetFare pour une utilisation ultérieure.

4. Intégration Spring

4.1. Configuration de Spring Bean

Maintenant, passons à l'intégration Spring.

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

@Configuration
@ComponentScan("com.example.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 deKieServices.Factory.get().

Ensuite, nous devons obtenir leKieContainer 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 dontKieFileSystem, KieBuilder, etKieModule.

Créons maintenant unKieModule qui est un conteneur de toutes les ressources nécessaires pour définir la connaissance des règles connue sous le nom deKieBase.

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é à l'intérieur deKieModule. LesKieBase peuvent être obtenus à partir desKieContainer.

Une fois queKieModule est créé, nous pouvons procéder à la création deKieContainer qui contient lesKieModule où leKieBase a été défini. LeKieContainer 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 transmettant l'objetFact 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, unKieSession est créé à l'aide de l'instanceKieContainer. Une instanceKieSession est un endroit où les données d'entrée peuvent être insérées. LeKieSession 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 (comme une variable globale) est utilisé pour transmettre des informations au moteur. Nous pouvons définir le Global en utilisantsetGlobal(“key”, value); dans cet exemple, nous avons défini l'objetFare comme Global pour stocker le tarif de taxi calculé.

Comme nous l'avons vu dans la section 4,a Rule requires data to operate on. Nous insérons lesFact dans la session en utilisantkieSession.insert(taxiRide);

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

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

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 des extraits de code sont disponiblesover on GitHub.