2017-08-25 4 views
0

Ich bin neu in Drools und Entscheidungstabellen. Ich muss eine Regel erstellen, um zu testen, ob eine Person älter/jünger ist und das Alter der Person für die Regel verwendet. Die Regel funktioniert aber in Endlosschleife.Drools Endlosschleife in Entscheidungstabelle

Dies ist die Regel, ist grundlegend, Person Alter> 18 dann ist die Person älter, oder Person Alter weniger als 18, Person ist jung. Im Folgenden ist der HTML-Code aus meiner Excel-Datei:

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

Meine Persona-Klasse ist eine einfache POJO für Test der Entscheidungstabelle:

Klasse Person (statisch, in Hauptklasse):

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; 
    } 



} 

Meine wichtigste Methode, ich bin mit drools 6.5 mit JRE 1.7:

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(); 
    } 
} 

Dies ist der Ausgang, in Endlosschleife.

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

Danke für jeden Tipp, Link, Tutorial usw.

Antwort

1

Sobald Sie update() auf einer Tatsache verwenden, Auswertung beginnt wieder, und die Regel feuert wieder, weil die Einschränkungen noch wahr sind.

Sie könnten mayerEdad zu einem booleschen Wert machen und die Bedingung mayorEdad == null hinzufügen.

Oder Sie können die update vermeiden, wenn Sie nicht erwarten, dass andere Regeln basierend auf dem Wert von borderEdad ausgelöst werden.

Verwandte Themen