Contexte Industriel
Dans les environnements industriels aux logiques complexes, une architecture découplée utilisant un moteur de règles externe est recommandée. Drools, solution open-source d'IBM, permet cette séparation.
Bonnes Pratiques d'Ingénierie des Connaissances
- À éviter :
- Architecture monolithique
- Fuites de responsabilités
- Recommandé :
- Découplage des resopnsabilités métier
- Encapsulation des connaissances
- Abstractions sémantiques
La séparation entre création et utilisation des règles permet aux consommateurs d'obtenir des conclusions sans détenir la logique conditionnelle sous-jacente.
Fonctionnalités Clés de Drools
- Résolution des Conflits : Priorité via
SalienceouLIFO - Modèle Événementiel : Mécanisme pour la programmation orientée aspect (AOP)
- Formats de Fichiers : .drl, XML, XLS, CSV
Configuration Maven
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>7.36.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>7.36.0.Final</version>
</dependency>
Structure de Projet
kmodule.xmldoit résider danssrc/main/resources/META-INF- Les règles doivent être dans
src/main/resources, avec des chemins correspondant aux packages déclarés danskmodule.xml
Exemple kmodule.xml
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="base_principale" packages="regles.defaut">
<ksession name="session_par_defaut"/>
</kbase>
</kmodule>
Exemple de Règle DRL
package regles.defaut;
dialect "mvel"
import com.example.Produit;
regle "remise_speciale"
quand
article : Produit(prixAvant <= 500)
alors
double prixFinal = article.getPrixAvant() * 0.50;
article.setPrixReel(prixFinal);
System.out.println(article.getNom() + " : " + prixFinal);
fin
Types de Sessions
- Stateless : Aucune conservation d'état entre les invocations (validation, calculs)
- Stateful : Maintient l'état pour les règles dépendantess de modifications
Contrôle d'Exécution
- Salience : Priorité numérique des règles
- Agenda Groups : Partitionnement logique avec
setFocus() - Activation Groups : Une seule règle déclenchée par groupe
Requêtes et Événements
requete "clients_mineurs"
client : Client(age < 18)
fin
Les requêtes live utilisent des listeners pour des mises à jour en temps réel.
Optimisations
- Mode séquentiel pour les sessions stateless
- Éviter les opérations lourdes dans les listeners