Drools à l'aide de règles à partir de fichiers Excel

1. Vue d'ensemble

Drools prend en charge la gestion des règles métier dans un format de feuille de calcul.

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

2. Dépendances de Maven

Ajoutons les dépendances Drools requises dans notre application:

 org.kie kie-ci 7.1.0.Beta2   org.drools drools-decisiontables 7.1.0.Beta2 

La dernière version de ces dépendances est disponible sur 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:

  • Les clients individuels de plus de 3 ans bénéficient de 15% de réduction
  • Les clients individuels de moins de 3 ans bénéficient de 5% de réduction
  • 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 et les mots-clés requis par Drools:

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

  • RuleSet - indique le début de la table de décision
  • Importer - Classes Java utilisées dans les règles
  • RuleTable - indique le début de l'ensemble de règles
  • Nom - Nom de la règle
  • CONDITION - l'extrait de code de la condition à vérifier par rapport aux données d'entrée. Une règle doit contenir au moins une condition
  • ACTION - l'extrait de code de l'action à entreprendre si 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 années ) et pour stocker le résultat ( remise ).

La classe Client :

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 de moteur de règles Drools

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

4.1. KieServices

La classe KieServices permet d'accéder à toutes les fonctionnalités de compilation et d'exécution de Kie. Il fournit plusieurs usines, services et méthodes utilitaires. Alors, commençons par mettre la main sur une instance KieServices :

KieServices kieServices = KieServices.Factory.get();

En utilisant les 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-y notre feuille de calcul Excel:

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 ( tout fichier jar produit par Maven 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 du KieContainer . Notre application interagit avec KieSession , qui stocke et s'exécute sur les données d'exécution:

KieSession kieSession = kieContainer.newKieSession();

5. Exécution des 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. Pour cette raison, il peut être difficile de traiter les erreurs et les fautes de frappe dans le fichier Excel. Souvent, les erreurs se réfèrent au contenu du DRL. Donc pour dépanner, cela aide à imprimer et à 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 pour gérer les règles métier dans une feuille de calcul Excel. Nous avons vu la structure et l'ensemble 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 déclencher 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.