Introduction à Drools

Introduction à Drools

1. Vue d'ensemble

Drools est une solution BRMS (Business Rule Management System). Il fournit un moteur de règles qui traite les faits et produit une sortie à la suite d'un traitement de règles et de faits. La centralisation de la logique métier permet d’introduire des changements rapidement et à moindre coût.

Il permet également de combler le fossé entre les équipes métier et technique en fournissant un moyen d’écrire les règles dans un format facile à comprendre.

2. Dépendances Maven

Pour commencer avec Drools, nous devons d'abord ajouter quelques dépendances dans nospom.xml:


    org.kie
    kie-ci
    7.1.0.Beta1


    org.drools
    drools-decisiontables
    7.1.0.Beta1

La dernière version des deux dépendances est disponible sur le référentiel central Maven en tant quekie-ci etdrools-decisiontables.

3. Bases de Drools

Nous allons examiner les concepts de base de Drools:

  • Facts - représente les données qui servent d'entrée pour les règles

  • Working Memory un stockage avecFacts, où ils sont utilisés pour la correspondance de modèles et peuvent être modifiés, insérés et supprimés

  • Rule - représente une règle unique qui associeFacts aux actions correspondantes. Il peut être écrit en langage de règle Drools dans les fichiers.drl ou enDecision Table dans une feuille de calcul Excel

  • Knowledge Session - il contient toutes les ressources requises pour les règles de déclenchement; tous lesFacts sont insérés dans la session, puis les règles correspondantes sont déclenchées

  • Knowledge Base - représente les connaissances dans l'écosystème Drools, il a les informations sur les ressources où se trouventRules, et il crée également lesKnowledge Session

  • *Module* *–* Un module contient plusieurs bases de connaissances pouvant contenir différentes sessions

4. Configuration Java

Pour déclencher des règles sur une donnée donnée, nous devons instancier les classes fournies par le framework avec des informations sur l'emplacement des fichiers de règles et lesFacts:

4.1. KieFileSystem

Tout d'abord, nous devons définir le beanKieFileSystem; il s'agit d'un système de fichiers en mémoire fourni par le framework. Le code suivant fournit le conteneur permettant de définir les ressources Drools telles que des fichiers de règles, des tables de décision, par programme:

public KieFileSystem kieFileSystem() throws IOException {
    KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
        for (Resource file : getRuleFiles()) {
            kieFileSystem.write(
              ResourceFactory.newClassPathResource(
              RULES_PATH + file.getFilename(), "UTF-8"));
        }
        return kieFileSystem;
}

Ici,RULES_PATH indique l'emplacement des fichiers de règles sur le système de fichiers. Ici, nous lisons les fichiers declasspath qui est généralement/src/main/resources dans le cas d'un projet Maven.

4.2. KieContainer

Ensuite, nous devons définir leKieContainer qui est un espace réservé pour tous lesKieBases pour unKieModule. KieContainer particulier est construit à l'aide d'autres beans, y comprisKieFileSystem, KieModule, etKieBuilder.

La méthodebuildAll() appelée surKieBuilder construit toutes les ressources et les lie àKieBase.. Elle ne s’exécute avec succès que s’il est capable de trouver et de valider tous les fichiers de règles:

public KieContainer kieContainer() throws IOException {
    KieRepository kieRepository = getKieServices().getRepository();

    kieRepository.addKieModule(new KieModule() {
        public ReleaseId getReleaseId() {
            return kieRepository.getDefaultReleaseId();
        }
    });

    KieBuilder kieBuilder = getKieServices()
      .newKieBuilder(kieFileSystem())
      .buildAll();


    return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}

4.3. KieSession

Les règles sont déclenchées en ouvrant un beanKieSession - qui peut être récupéré à partir deKieContainer:

public KieSession kieSession() throws IOException {
    return kieContainer().newKieSession();
}

5. Règles de mise en œuvre

Maintenant que nous en avons terminé avec la configuration, examinons quelques options pour créer des règles.

Nous allons explorer la mise en œuvre de la règle par un exemple de catégorisation d'un candidat pour un rôle spécifique, en fonction de son salaire actuel et du nombre d'années d'expérience qu'il possède.

5.1. Fichier de règles Drools (.drl)

En termes simples, le fichier de règles Drools contient toutes les règles de gestion.

A rule includes a When-Then construct, ici la sectionWhen liste la condition à vérifier, et la sectionThen liste l'action à entreprendre si la condition est remplie:

package com.example.drools.rules;

import com.example.drools.model.Applicant;

global com.example.drools.model.SuggestedRole suggestedRole;

dialect  "mvel"

rule "Suggest Manager Role"
    when
        Applicant(experienceInYears > 10)
        Applicant(currentSalary > 1000000 && currentSalary <=
         2500000)
    then
        suggestedRole.setRole("Manager");
end

Cette règle peut être déclenchée en insérant les faitsApplicant etSuggestedRole dansKieSession:

public SuggestedRole suggestARoleForApplicant(
    Applicant applicant,SuggestedRole suggestedRole){
    KieSession kieSession = kieContainer.newKieSession();
    kieSession.insert(applicant);
    kieSession.setGlobal("suggestedRole",suggestedRole);
    kieSession.fireAllRules();
    // ...
}

Il teste deux conditions sur l'instanceApplicant, puis en fonction du respect des deux conditions, il définit le champRole dans l'objetSuggestedRole.

Ceci peut être vérifié en exécutant le test:

@Test
public void whenCriteriaMatching_ThenSuggestManagerRole(){
    Applicant applicant = new Applicant("David", 37, 1600000.0,11);
    SuggestedRole suggestedRole = new SuggestedRole();

    applicantService.suggestARoleForApplicant(applicant, suggestedRole);

    assertEquals("Manager", suggestedRole.getRole());
}

Dans cet exemple, nous avons utilisé quelques mots clés fournis par Drools. Comprenons leur utilisation:

  • package – c'est le nom du package que nous spécifions dans leskmodule.xml, le fichier de règles se trouve dans ce package

  • import - ceci est similaire à l'instruction Javaimport, ici nous devons spécifier les classes que nous insérons dans lesKnowledgeSession

  • global – ceci est utilisé pour définir une variable de niveau global pour une session; cela peut être utilisé pour passer un paramètre d'entrée ou pour obtenir un paramètre de sortie pour résumer les informations d'une session

  • dialect - un dialecte spécifie la syntaxe utilisée dans les expressions de la section condition ou de la section action. Par défaut, le dialecte est Java. Drools supporte également le dialectemvel; c'est un langage d'expression pour les applications basées sur Java. Il supporte le champ et l'accès méthode / getter

  • rule - cela définit un bloc de règles avec un nom de règle

  • when - ceci spécifie une condition de règle, dans cet exemple les conditions qui sont vérifiées sontApplicant ayantexperienceInYears plus de dix ans etcurrentSalary dans une certaine plage

  • then – ce bloc exécute l'action lorsque les conditions du blocwhen sont remplies. Dans cet exemple, le rôleApplicant est défini comme Manager

5.2. Tables de décision

Une table de décision permet de définir des règles dans une feuille de calcul Excel pré-formatée. L'avantage des tables de décision fournies par Drools est qu'elles sont faciles à comprendre, même pour une personne non technique.

En outre, il est utile lorsqu'il existe des règles similaires, mais avec des valeurs différentes, dans ce cas, il est plus facile d'ajouter une nouvelle ligne sur une feuille Excel contrairement à l'écriture d'une nouvelle règle dans les fichiers.drl. Voyons la structure d’une table de décision avec un exemple d’application de l’étiquette sur un produit en fonction du type de produit:

image

La table de décision est regroupée en différentes sections, celle du haut est comme une section d'en-tête où nous spécifions lesRuleSet (i.e. package contenant les fichiers de règles),Import (classes Java à importer) etNotes (commentaires sur le but des règles).

La section centrale où nous définissons les règles s'appelleRuleTable qui regroupe les règles qui sont appliquées au même objet de domaine.

Dans la ligne suivante, nous avons les types de colonnesCONDITION etACTION. Dans ces colonnes, nous pouvons accéder aux propriétés de l'objet de domaine mentionné dans une ligne et à leurs valeurs dans les lignes suivantes.

Le mécanisme pour déclencher les règles est similaire à ce que nous avons vu avec les fichiers.drl.

Nous pouvons vérifier le résultat de l'application de ces règles en exécutant le test:

@Test
public void whenProductTypeElectronic_ThenLabelBarcode() {
    Product product = new Product("Microwave", "Electronic");
    product = productService.applyLabelToProduct(product);

    assertEquals("BarCode", product.getLabel());
}

6. Conclusion

Dans cet article rapide, nous avons exploré l'utilisation de Drools en tant que moteur de règles métier dans notre application. Nous avons également vu les multiples façons dont nous pouvons écrire les règles dans le langage de règles Drools ainsi que dans le langage facile à comprendre dans les feuilles de calcul.

Comme toujours, le code complet de cet article est disponibleover on GitHub.