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.
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
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