2016-09-26 1 views
0

これはSpring Batchアプリケーションで、リーダーは1度に1オブジェクトずつプロセッサに渡します。しかし、多くの(数千の)オブジェクトが読み込み/処理されることがあります。Springバッチプロセッサのランダムパーセンテージ値に基づいて処理/選択/反復する方法は?

プロセッサでは、渡されたパーセンテージに基づいてランダムに値を選択します。これは整数値(100未満)です。

このパーセント値は設定可能であり、ジョブパラメータとしてバッチアプリケーションに送信されます。 これは、任意の10%、20%、25%、30%、50%、75%などとすることができます。

たとえば、プロセッサで受信したオブジェクトのうち50%が2つしか処理されない場合は、&が処理されます(nullが返されます)。 75%の場合、プロセッサによって受信された4つのオブジェクトのうち3つが処理され、& 1は無視されます。

私は randomPercentが50%以上である場合には動作しません。この

int current = 0; 

public <T> process(<T> item) { 

    JobParameters parameters = stepExecution.getJobParameters(); 
    int randomPercent = parameters.getString("percentage"); 
    // randomPercent = 50; 

    int num = 100/randomPercent; 
    // num = 100/50 = 2 

    if(current % n == 0) { 
     // process this object 
     current++; 
     return item; 

    } else { 
     // do not process this 
     current++; 
     return null; 
    } 
} 

上記のコードのようなものを考えていました。

パーセンテージの値を処理してそれに基づいて反復処理を行うには、より優れた方法があります。

ありがとうございます!

+0

。 オブジェクトの数は最小ですか? 作家は何をしていますか? –

+0

1.最低でも数百のアイテム/オブジェクトが存在する可能性があります 2. randomPercent値に基づいて、 アイテムがプロセッサによって処理される場合はライターに送信され、ライターは通知を送信し、アイテムが処理されない場合はプロセッサが戻りますライターにはnull - 何も起こりません。 – src3369

答えて

0

あなたの入力に基づいて、私は以下のように考えています。

プロセッサに処理するキューがあります。キューが100まで満たされている場合、アイテムをピックアップして開始し、リストをWriterに送信します。それ以外の場合、プロセッサはアイテムをキューに保持し続けます。

コードとして:私は2つの質問がある

@Value("#{jobParameters['percentage']}") 
private Integer percentage; 

private List queue = new ArrayList(); 
private Integer count = 0; 

public List<<T>> process(<T> item) { 
     count ++; 

     if (count == 100) { 
      List result = pickupItemByPercentage(); 
      this.count = 0;  // reset 
      this.queue.clear(); // reset; 

      return result; 
     } 
     else { 
      this.queue.add(item); 
      return null; 
     } 
} 

/** 
This method is to return a list of item base on the percentage 
**/ 
private List pickupItemByPercentage() { 
    List result = new ArrayList(); 

    // TODO: you can change the logic to pick up items if you want. 
    for (int i=0; i<this.percentage; i++) { 
     result.add(this.queue.get(i)); 
    } 

    return result; 
} 
関連する問題