2016-09-26 45 views
0

這是Spring Batch應用程序,讀者一次將1個對象傳遞給處理器。然而,可能會有很多(數千個)對象被讀取/處理。如何在Spring批處理器中基於隨機百分比值處理/選擇/迭代?

在處理器中,只能根據傳入的百分比(整數值(小於100))隨機選擇值。

此百分比值可配置並作爲作業參數發送到批處理應用程序。 它可以是任何10%,20%,25%,30%,50%,75%等等。

舉個例子,如果它的50%,那麼處理器收到的2個對象中只有1個會被處理&另一個會被忽略(返回null)。 如果它是75%,那麼處理器收到的4個對象中的3個將被處理& 1將被忽略。

我在想這樣的事情

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

上面的代碼情況下 randomPercent是大於50%不工作。

有沒有更好的/優雅的方式來處理百分比值和基於它的迭代。

謝謝!

+0

我有2個問題。 你有最小數量的對象嗎? 作者做什麼? –

+0

1.至少可能有幾百個項目/對象 2.基於randomPercent值, 如果項目由處理器處理,則將其發送到寫入器,寫入器發送通知,如果項目未處理,則處理器返回寫給作者 - 沒有任何反應。 – src3369

回答

0

根據你的意見,我正在想辦法如下。

處理器將有一個隊列來處理。如果隊列填充到100,我們將開始按百分比提取項目並將列表發送到Writer。否則,處理器將繼續向隊列填充項目。

代碼爲:

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