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 .