2016-11-02 10 views
2

ループ内で多くのブール式を実行する必要があるプロジェクトで使用するためのdroolsを学習しようとしています。私の現在のコードは以下の通りです。これは概念をテストし学習するためのものです。文kSession.fireAllRules();は、forループの中にあるので、rulesファイルを何度も実行する必要がありますが、一度だけ実行されます。私はここで間違って何をしていますか?なぜループ内に与えられても、droolsルールエンジンは一度だけ実行されますか?

Javaコード

 List outList = new ArrayList<Boolean>(); 
     kSession.setGlobal("outList", outList); 
     List rulesList = new ArrayList<Boolean>(); 
     kSession.setGlobal("rulesList", rulesList); 

     for (int i = 0; i < 10; i++) { 

      rule1=!rule1; 
      rule2 =!rule2; 
      rule3 =!rule3; 
      rulesList.clear(); 
      rulesList.add(rule1); 
      rulesList.add(rule2); 
      rulesList.add(rule3); 

      kSession.insert(droolsIntroduction); 
      kSession.fireAllRules(); 

      boolean result1 = (boolean) outList.get(0); 
      boolean result2 = (boolean) outList.get(1); 
      boolean result3 = (boolean) outList.get(2); 

     } 

ルールファイル:

global String topicLevel 
global java.util.List rulesList 
global java.util.List outList 

rule "Drools Introduction" 
when 
$droolsIntro : DroolsIntroduction(measurename == "measure1") 
then 

boolean result1= (boolean)rulesList.get(0) && (boolean)rulesList.get(1) && (boolean)rulesList.get(2) 
boolean result2= result1 && (boolean)rulesList.get(2); 
boolean result3= result1 && (boolean)rulesList.get(2); 
//outList.clear(); 
outList.add(result1); 
outList.add(result2); 
outList.add(result3); 

end 
function String getDefaultIfNull(String topicLevel) { 
return topicLevel == null ? "Moderate" : topicLevel; 
} 

答えて

1

ルールはDroolsのエンジンを呼び出すことで、 "実行" されていません。どちらのルールを「解雇」するかは、Droolsエンジン次第です。ルールで評価されたファクトの変更がない限り、ルールは再開されません。

ただし、セッションを破棄して別のセッションを作成し、再度実行することもできます。

for(int i =...){ 
    KieSession kSession = ...; 
    List outList = new ArrayList<Boolean>(); 
    kSession.setGlobal("outList", outList); 
    List rulesList = new ArrayList<Boolean>(); 
    kSession.setGlobal("rulesList", rulesList); 
    rule1 = ...; 
    kSession.insert(droolsIntroduction); 
    kSession.fireAllRules(); 
    boolean result1 = ...; 
    kSession.dispose(); 
} 

私はあなたが正しい軌道に乗っているかどうかわからない:この拡張ループは、あなたが示されていないので、私はここでしかそれをスケッチすることができますいくつかのコードが含まれます。多くのブール式を評価することは、ルールエンジンでは必ずしも最適ではありません。

+0

ループ内に 'kSession.delete(droolsHandle)'はありますか?私はそれを試して、それは働いているのです。 'droolHandle'は' kSession.insert(droolsIntroduction);の戻りオブジェクトです。 – Vishnu

+0

あなたの提案は何ですか? – Vishnu

+0

はい、古いファクトを削除して新しいファクトを挿入すると、一致するルールが再び発生します。 – laune

関連する問題