0

私は Drools を初めて使用し、事実 (BankAccount 情報) のバッチを取得する要件に取り組んでいます。3 つの連続したマイナー アカウント (年齢 <16) がセッションのワーキング メモリに挿入されると、警告メッセージを表示する必要があります。グローバル変数を維持し、未成年者のアカウントが挿入されたときにそれを増やしてみました。しかし、アラート メッセージを配信するために使用するグローバル カウンター値に基づいたルールを定義することができません。以下の DRL ファイルを見つけて、これに対する解決策を提供してください。

以下のルールは起動していません

 rule checkCounterAndProduceAlert when
       b: ResultFact( value > 2 )   
    then
        System.out.println("Alert****");  
    end

Here is the DRL full content of DRL file




        package com.ys.drools.rules

import com.ys.drools.facts.*;

rule checkCounterAndProduceAlert 

no-loop true
when
   b: ResultFact( value > 2 )   
then
    System.out.println("Alert****");  
end


rule checkSeriesOfMinorAccount when
    a : AccountHolder( age < 16 )
    b : ResultFact()
then
b.inc();
update(b);

System.out.println("Incrementing count  since minor account appered");
System.out.println("***********************************************");
System.out.println(b.getValue());
end


rule checMajorAccount when
    a : AccountHolder( age >16 )
    b :ResultFact()
then
b.reset();
update(b);
System.out.println("Making count zero since major account appered");
System.out.println(b.getValue());
end

これは、3 つのマイナー アカウントをロードしてアプリケーションをテストする Java クラスです。

package com.ys.drools.data.loader;

import java.util.ArrayList;
import java.util.List;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ys.drools.facts.AccountHolder;
import com.ys.drools.util.BankAccountUtilService;
import com.ys.drools.util.DroolsGlobalUtil;

public class Test {
    private BankAccountUtilService service;
    private  KieContainer kieContainer;
    private KieSession kieSession;
    private static Logger log = LoggerFactory
            .getLogger(Test.class);

    private List<AccountHolder> accountHolders=new ArrayList<AccountHolder>();  

    public Test(){
        kieContainer= KieServices.Factory.get().getKieClasspathContainer();     
          kieSession = kieContainer.newKieSession("BankAccountSession");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Test test=new Test();
        List<AccountHolder> aList=test.fillAccountHolderList();
         ResultFact fact=new ResultFact();
       test.kieSession.insert(fact);
       for(int i=0;i<aList.size();i++){
        test.kieSession.insert(aList.get(i));
        test.kieSession.fireAllRules();
        }

      }


    public List<AccountHolder> fillAccountHolderList(){
         List<AccountHolder> accountHolders=new ArrayList<AccountHolder>(); 
         AccountHolder a1=new AccountHolder("Karun", 12);
         AccountHolder a2=new AccountHolder("kumar", 12);
         AccountHolder a3=new AccountHolder("rakesh", 10);
         accountHolders.add(a1);
         accountHolders.add(a2);
         accountHolders.add(a3);
         return accountHolders; 
    }
}

これに対する解決策を提供してください。テストクラス実行時の出力

Incrementing count  since minor account appered
***********************************************
1
Incrementing count  since minor account appered
***********************************************
2
Incrementing count  since minor account appered
***********************************************
3
Making count zero since major account appered
0

("Alert****") は、値が >2 になった後でも表示されません。ルール「checkCounterAndProduceAlert」が起動していません

4

1 に答える 1

0

解決策は簡単です。

class Counter {
    private int value;
    public void inc(){ value++; }
    public void reset(){ value = 0; }
    public int getValue(){ return value; }
}

ルールにパターンを追加した後、Counter ファクトを作業メモリに挿入し、必要に応じてメソッドを使用incします。reset$c: Counter()

rule checkCounterAndProduceAlert when
    Counter( value == 3 )   
then
    System.out.println("Alert****");  
end

未成年者が 6 回目、9 回目、... と続けてアカウントを作成した後、別のアラートを発行するかどうかを指定する必要がある場合があります。

編集

これを DRL ファイルに宣言して挿入することもできます。

declare Counter
  value : int
end

rule "insert counter"
  salience 999999
when
  not Counter()
then
  insert( new Counter() );
end
于 2016-12-03T04:59:34.530 に答える