Drools utilisant des règles de fichiers Excel

1. Vue d’ensemble

Dans cet article, nous allons voir un exemple rapide d’utilisation de Drools pour gérer des règles métier à l’aide d’un fichier Excel.

2. Dépendances Maven

Ajoutons les dépendances requises de Drools dans notre application:

<dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-ci</artifactId>
    <version>7.1.0.Beta2</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-decisiontables</artifactId>
    <version>7.1.0.Beta2</version>
</dependency>

La dernière version de ces dépendances est disponible à l’adresse https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.kie%22%20AND%20a%3A%22kie-ci%22 .[kie-ci]et drools-decisiontables .

3. Définition de règles dans Excel

Pour notre exemple, définissons des règles pour déterminer la remise en fonction du type de client et du nombre d’années en tant que client:

  • 15% de réduction pour les clients individuels âgés de plus de 3 ans

  • Les clients individuels de moins de 3 ans bénéficient d’une réduction de 5%

  • Tous les clients professionnels bénéficient d’une réduction de 20%

3.1. Le fichier Excel

Commençons par créer notre fichier excel selon la structure spécifique Mots-clés requis par Drools:

lien:/uploads/Drools__Excel.png%201176w[]

Pour notre exemple simple, nous avons utilisé le jeu de mots-clés le plus pertinent:

  • RuleSet - indique le début de la table de décision

  • Import - Classes Java utilisées dans les règles

  • RuleTable - indique le début de l’ensemble de règles

  • Name - Nom de la règle

  • CONDITION - l’extrait de code de la condition à vérifier

les données d’entrée. Une règle doit contenir au moins une condition ** ACTION - l’extrait de code de l’action à entreprendre si le

les conditions de la règle sont remplies. Une règle doit contenir au moins une action. Dans l’exemple, nous appelons setDiscount sur l’objet Customer

De plus, nous avons utilisé la classe Customer dans le fichier Excel. Alors, créons cela maintenant.

3.2. La classe Client

Comme le montrent les CONDITIONS et ACTION de la feuille Excel, nous utilisons un objet de la classe Customer pour les données d’entrée ( type et years ) et pour stocker le résultat ( discount ).

La classe Customer :

public class Customer {
    private CustomerType type;

    private int years;

    private int discount;

   //Standard getters and setters

    public enum CustomerType {
        INDIVIDUAL,
        BUSINESS;
    }
}

4. Création d’une instance du moteur de règles Drools

Avant de pouvoir exécuter les règles que nous avons définies, nous devons utiliser une instance du moteur de règles Drools. Pour cela, nous devons utiliser les composants centraux de Kie.

4.1. KieServices

KieServices kieServices = KieServices.Factory.get();

En utilisant KieServices, nous allons créer de nouvelles instances de KieFileSystem , KieBuilder et KieContainer .

4.2. KieFileSystem

KieFileSystem est un système de fichiers virtuel. Ajoutons notre feuille de calcul Excel à celle-ci:

Resource dt
  = ResourceFactory
    .newClassPathResource("com/baeldung/drools/rules/Discount.xls",
      getClass());

KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt);

4.3. KieBuilder

Maintenant, construisez le contenu de KieFileSystem en le passant à KieBuilder :

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

S’il est construit avec succès, il crée un _KieModule ( any, un pot contenant un kmodule.xml, est un KieModule_ ).

4.4. KieRepository

Le framework ajoute automatiquement le KieModule (résultant de la construction) à KieRepository :

KieRepository kieRepository = kieServices.getRepository();

4.5. KieContainer

Il est maintenant possible de créer un nouveau KieContainer avec ce KieModule en utilisant son ReleaseId . Dans ce cas, Kie attribue un ReleaseId par défaut:

ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId();
KieContainer kieContainer
  = kieServices.newKieContainer(krDefaultReleaseId);

4.6. KieSession

Nous pouvons maintenant obtenir KieSession à partir de KieContainer . Notre application interagit avec la KieSession , qui stocke et exécute les données d’exécution:

KieSession kieSession = kieContainer.newKieSession();

5. Exécuter les règles

Enfin, il est temps de fournir des données d’entrée et de déclencher les règles:

Customer customer = new Customer(CustomerType.BUSINESS, 2);
kieSession.insert(customer);

kieSession.fireAllRules();

6. Cas de test

Ajoutons maintenant quelques cas de test:

public class DiscountExcelIntegrationTest {

    private KieSession kSession;

    @Before
    public void setup() {
        Resource dt
          = ResourceFactory
            .newClassPathResource("com/baeldung/drools/rules/Discount.xls",
              getClass());
        kSession = new DroolsBeanFactory().getKieSession(dt);
    }

    @Test
    public void
      giveIndvidualLongStanding__whenFireRule__thenCorrectDiscount()
        throws Exception {
        Customer customer = new Customer(CustomerType.INDIVIDUAL, 5);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 15);
    }

    @Test
    public void
      giveIndvidualRecent__whenFireRule__thenCorrectDiscount()
      throws Exception {
        Customer customer = new Customer(CustomerType.INDIVIDUAL, 1);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 5);
    }

    @Test
    public void
      giveBusinessAny__whenFireRule__thenCorrectDiscount()
        throws Exception {
        Customer customer = new Customer(CustomerType.BUSINESS, 0);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 20);
    }
}

7. Dépannage

Drools convertit la table de décision en DRL . En raison de cela, traiter les erreurs et les fautes de frappe dans le fichier Excel peut être difficile. Les erreurs se réfèrent souvent au contenu du DRL. Donc, pour dépanner, il est utile d’imprimer et d’analyser le DRL:

Resource dt
  = ResourceFactory
    .newClassPathResource("com/baeldung/drools/rules/Discount.xls",
      getClass());

DecisionTableProviderImpl decisionTableProvider
  = new DecisionTableProviderImpl();

String drl = decisionTableProvider.loadFromResource(dt, null);

8. Conclusion

Dans cet article, nous avons vu un exemple rapide d’utilisation de Drools dans la gestion de règles de gestion dans une feuille de calcul Excel. Nous avons vu la structure et le jeu minimal de mots-clés à utiliser pour définir des règles dans un fichier Excel. Ensuite, nous avons utilisé des composants Kie pour lire et appliquer les règles.

Enfin, nous avons écrit des cas de test pour vérifier les résultats.

Comme toujours, l’exemple utilisé dans cet article se trouve dans le projet Github .