2017-08-25 4 views
0

J'ai appris Drools et j'ai implémenté un programme simple. Cependant, la sortie ne donne pas le résultat comme prévu.Sortie inattendue des drools règles

Règle fichier .drl:

rule "Is of valid age" salience 10 
    when 
     $a: Applicant (getAge() > 18) 
    then 
     $a.setValid(true); 
     System.out.println($a.getName() + " is eligible for driving license!"); 
end 

rule "Can by alcohol" salience 1 
    when 
     $a: Applicant(isValid() == false); 
    then 
     System.out.println($a.getName() + " cannot buy alcohol!"); 
end 

Dans principale insérer un objet candidat simle:

Applicant applicant1 = new Applicant("Berat", 20, 2010); 
kieSession.insert(applicant1); 
kieSession.fireAllRules(); 
System.out.println(applicant1.getName() + " is of valid age: " + applicant1.isValid()); 

Quand je tire toutes les règles à cet objet la sortie est:

Berat est admissible à un permis de conduire!
Berat ne peut pas acheter de l'alcool!
Berat est l'âge valide: true

Bien que, je donne la priorité des règles avec mot-clé saillance, règle « Can par l'alcool » est encore tiré. Il ne doit pas être déclenché car dans la première règle, isValid (true) est exécuté et dans la deuxième règle isValid() == false, la vérification doit renvoyer false, alors une partie doit être ignorée.

+0

Je crois que le comportement est correct la priorité définit la priorité et donc la règle de saillance élevée s'exécute d'abord puis est suivie par une autre – mhasan

+0

Comme l'âge de l'objet demandeur est supérieur à 18, setValid (true) doit être exécuté isValid() == false devrait retourner false et la partie de la règle ne devrait pas être exécutée. – InstantCrush

Répondre

1

La déclaration

$a.setValid(true); 

ne fixe valable même pour le demandeur, mais cela ne se propage pas au moteur de règles Drools. Vous devez

modify($a){ setValid(true) } 

pour d'autres règles de faible saillance pour voir le réglage correct.

Rétractant le fait ne fait que masquer le problème.

0

Je pense que saillance définit uniquement l'ordre d'exécution.

Vous pouvez essayer retract($a) dans la règle d'âge valide dans la clause then.

+0

Cela a résolu mon problème, merci pour les conseils. – InstantCrush