2017-08-25 8 views
0

Droolsとデシジョン・テーブルを初めて使用しました。私はルールの人の年齢を使ってPersonが年長/若者であるかどうかをテストするルールを作成する必要があります。ルールは機能しますが、無限ループです。意思決定表のDroolsの無限ループ

これは基本的なもので、人の年齢が18歳を超えると、その人は年長で、18歳未満の人は若いです。 (メインクラスの静的、)

Personクラス:私のペルソナクラスはテストデシジョンテーブルのためのシンプルなPOJOです

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

:以下は、私のExcelファイルからHTMLです

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



} 

私の主な方法、私は、JRE 1.7でのDrools 6.5を使用しています:

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を避けることができます。

関連する問題