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 du traitement des règles et des faits. La centralisation de la logique métier permet d'introduire des changements rapidement et à moindre coût.

Il comble également le fossé entre les équipes commerciales et techniques en fournissant une facilité pour rédiger les règles dans un format facile à comprendre.

2. Dépendances de Maven

Pour commencer avec Drools, nous devons d'abord ajouter quelques dépendances dans notre pom.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 que kie-ci et drools-decisiontables.

3. Principes de base de Drools

Nous allons examiner les concepts de base de Drools:

  • Faits - représente les données qui servent d'entrée aux règles
  • Mémoire de travail - un stockage avec des faits, où ils sont utilisés pour la correspondance de modèles et peuvent être modifiés, insérés et supprimés
  • Règle - représente une règle unique qui associe les faits aux actions correspondantes. Il peut être écrit en langage de règle Drools dans lesfichiers .drl ou en tant que tableau de décision dans une feuille de calcul Excel
  • Session de connaissances - il contient toutes les ressources nécessaires pour les règles de tir; tous les faits sont insérés dans la session, puis les règles correspondantes sont déclenchées
  • Base de connaissances - représente les connaissances de l'écosystème Drools, contient les informations sur les ressources oùse trouvent les règles et crée également la session de connaissances
  • Module - Un module contient plusieurs bases de connaissances qui peuvent tenir 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 les faits:

4.1. KieFileSystem

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

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 de classpath qui est généralement / src / main / resources dans le cas d'un projet Maven.

4.2. KieContainer

Ensuite, nous devons définir le KieContainer qui est un espace réservé pour toutes les KieBases pour un KieModule particulier . KieContainer est construit à l'aide d'autres beans, notamment KieFileSystem, KieModule et KieBuilder.

La méthode buildAll () appelée sur KieBuilder construit toutes les ressources et les lie à KieBase. Il ne s'exécute avec succès que lorsqu'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 bean KieSession - qui peut être récupéré à partir de KieContainer:

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

5. Règles d'application

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

Nous explorerons 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 métier.

Une règle comprend une construction When-Then , ici la section When répertorie la condition à vérifier, et la section Then répertorie l'action à entreprendre si la condition est remplie:

package com.baeldung.drools.rules; import com.baeldung.drools.model.Applicant; global com.baeldung.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 faits Applicant et SuggestedRole dans KieSession:

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' instance Applicant , puis en fonction de la satisfaction des deux conditions, il définit le champ Role dans l' objet SuggestedRole .

Cela 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 le kmodule.xml, le fichier de règles se trouve à l'intérieur de ce package
  • import - ceci est similaire à l'instruction d' importation Java, ici nous devons spécifier les classes que nous insérons dans la KnowledgeSession
  • global - il 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
  • dialecte - un dialecte spécifie la syntaxe employée dans les expressions de la section condition ou de la section action. Par défaut, le dialecte est Java. Drools prend également en charge le dialecte mvel ; c'est un langage d'expression pour les applications basées sur Java. Il prend en charge le champ et l'accès à la méthode / au getter
  • règle - cela définit un bloc de règles avec un nom de règle
  • quand - ceci spécifie une condition de règle, dans cet exemple les conditions qui sont vérifiées sont Candidat ayant une expérience en années de plus de dix ans et salaire actuel dans une certaine plage
  • then – this block executes the action when the conditions in the when block met. In this example, the Applicant role is set as Manager

5.2. Decision Tables

A decision table provides the capability of defining rules in a pre-formatted Excel spreadsheet. The advantage with Drools provided Decision Table is that they are easy to understand even for a non-technical person.

Also, it is useful when there are similar rules, but with different values, in this case, it is easier to add a new row on excel sheet in contrast to writing a new rule in .drl files. Let's see what the structure of a decision table with an example of applying the label on a product based on the product type:

The Decision Table is grouped in different sections the top one is like a header section where we specify the RuleSet (i.e. package where rule files are located), Import (Java classes to be imported) and Notes (comments about the purpose of rules).

The central section where we define rules is called RuleTable which groups the rules which are applied to the same domain object.

In the next row, we have column types CONDITION and ACTION. Within these columns, we can access the properties of the domain object mentioned in one row and their values in the subsequent rows.

The mechanism to fire the rules is similar to what we have seen with .drl files.

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 comme 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 disponible à l'adresse over sur GitHub.