2017-08-25 3 views
0

Je suis nouveau à Drools et tables de décision. J'ai besoin de créer une règle pour tester si une personne est âgée/jeune en utilisant l'âge de la personne pour la règle. La règle fonctionne mais en boucle infinie.Drools boucle infinie dans la table de décision

Ceci est la règle, est de base, l'âge de la personne> 18 alors la personne est plus âgée, ou, personne âgée de moins de 18 ans, la personne est jeune. Ce qui suit est le code HTML de mon fichier Excel:

<style type="text/css"> 
 
\t table.tableizer-table { 
 
\t \t font-size: 10px; 
 
\t \t border: 1px solid #CCC; 
 
\t \t font-family: Courier New, Courier, monospace; 
 
\t } 
 
\t .tableizer-table td { 
 
\t \t padding: 4px; 
 
\t \t margin: 3px; 
 
\t \t border: 1px solid #CCC; 
 
\t } 
 
\t .tableizer-table th { 
 
\t \t background-color: #DED11F; 
 
\t \t color: #FFF; 
 
\t \t font-weight: bold; 
 
\t } 
 
</style> 
 
<table class="tableizer-table"> 
 
<thead><tr class="tableizer-firstrow"><th></th><th>&nbsp;</th><th>RuleTable Person</th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th></tr></thead><tbody> 
 
<tr><td>&nbsp;</td><td>&nbsp;</td><td>CONDITION</td><td>&nbsp;</td><td>ACTION</td><td>ACTION</td><td>ACTION</td></tr> 
 
<tr><td>&nbsp;</td><td>&nbsp;</td><td>p:Persona</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr> 
 
<tr><td>&nbsp;</td><td>&nbsp;</td><td>edad >= </td><td>edad <</td><td>System.out.println("Age: " + p.getEdad());</td><td>p.setMayorEdad($param);update(p);</td><td>System.out.println("Older:" +p.isMayorEdad());</td></tr> 
 
<tr><td>&nbsp;</td><td>Person rules</td><td>Status</td><td>Status</td><td>print</td><td>Is older?</td><td>Print ?</td></tr> 
 
<tr><td>&nbsp;</td><td>Older</td><td>18</td><td>&nbsp;</td><td>X</td><td>true</td><td>X</td></tr> 
 
<tr><td>&nbsp;</td><td>Yougn</td><td>&nbsp;</td><td>18</td><td>X</td><td>false</td><td>X</td></tr> 
 
</tbody></table>

Ma classe de Persona est un simple POJO pour le test de la table de décision:

classe Personne (statique, dans la classe principale):

public static class Persona{ 


    String nombre; 
    String apellidoPaterno; 
    String apellidoMaterno; 
    int edad; 
    float salario; 
    boolean mayorEdad = false; 

    public Persona() { 
     super(); 
    } 

    public Persona(String nombre, String apellidoPaterno, String apellidoMaterno, int edad, float salario) { 
     super(); 
     this.nombre = nombre; 
     this.apellidoPaterno = apellidoPaterno; 
     this.apellidoMaterno = apellidoMaterno; 
     this.edad = edad; 
     this.salario = salario; 
    } 

    public String getNombre() { 
     return nombre; 
    } 

    public void setNombre(String nombre) { 
     this.nombre = nombre; 
    } 

    public String getApellidoPaterno() { 
     return apellidoPaterno; 
    } 

    public void setApellidoPaterno(String apellidoPaterno) { 
     this.apellidoPaterno = apellidoPaterno; 
    } 

    public String getApellidoMaterno() { 
     return apellidoMaterno; 
    } 

    public void setApellidoMaterno(String apellidoMaterno) { 
     this.apellidoMaterno = apellidoMaterno; 
    } 

    public int getEdad() { 
     return edad; 
    } 

    public void setEdad(int edad) { 
     this.edad = edad; 
    } 

    public float getSalario() { 
     return salario; 
    } 

    public void setSalario(float salario) { 
     this.salario = salario; 
    } 

    public boolean isMayorEdad() { 
     return mayorEdad; 
    } 

    public void setMayorEdad(boolean mayorEdad) { 
     this.mayorEdad = mayorEdad; 
    } 



} 

Ma principale méthode, j'utilise Drools 6.5 avec 1.7 JRE:

public static final void main(String[] args) { 
    try { 
     // load up the knowledge base 
     KieServices ks = KieServices.Factory.get(); 
     KieContainer kContainer = ks.getKieClasspathContainer(); 
     KieSession kSession = kContainer.newKieSession("ksession-dtables"); 


     Persona p = new Persona(); 
     p.setNombre("Person"); 
     p.setEdad(18); 
     p.setMayorEdad(true); 



     kSession.insert(p); 
     kSession.fireAllRules(); 
     kSession.dispose(); 


    } catch (Throwable t) { 
     t.printStackTrace(); 
    } 
} 

c'est la sortie, en boucle infinie.

Age: 4 
Older:false 
Age: 4 
Older:false 
Age: 4 
Older:false 
Age: 4 
Older:false 
Age: 4 

Merci pour toute astuce, lien, tutoriel, etc.

Répondre

1

Dès que vous utilisez update() sur un fait, l'évaluation commence à nouveau, et les feux de règle à nouveau, car les contraintes sont toujours vrai.

Vous pouvez faire de mayorEdad une valeur booléenne et ajouter la contrainte mayorEdad == null.

Ou vous pouvez éviter le update si vous ne vous attendez pas à ce que d'autres règles soient déclenchées en fonction de la valeur de mayorEdad.