2017-08-25 76 views
0

我是新來的Drools和決策表。我需要創建一個規則來測試一個人是年齡還是年輕的人使用規則的年齡。該規則的作品,但無限循環。Drools無限循環決策表

這是規則,是基本的,人年齡> 18那麼人年齡大,或者年齡小於18歲的人年輕。下面是我的Excel文件的HTML:

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

我的女神類是考驗決策表一個簡單的POJO:

Person類(靜態,在主類):

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



} 

我主要的方法,我使用Drools的6.5與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(); 
    } 
} 

這是輸出,在無限循環中。

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

感謝您的任何提示,鏈接,教程等

回答

1

只要你在使用的事實update(),評估重新開始,再次統治火災,因爲限制仍然如此。

您可以使mayorEdad爲布爾值並添加約束條件mayorEdad == null

如果您不希望其他規則根據mayorEdad的值觸發,則可以避免使用update