2015-08-31 87 views
0

我在開發Spring批處理應用程序。我已經設置了一個使用ItemReader,ItemProcessor和ItemWriter的步驟。我的ItemReader執行一個HTTP請求,從API獲取json。處理器轉換其內容,最後作者將其保存到文本文件中。Spring批處理:根據itemReader中的結果執行作業

我正在從java調度程序執行此作業,其中我設置了itemReader用於執行HTTP請求(npag)的jobParameters。由於諮詢的API爲結果分頁,我想執行此作業的次數不確定,直到http請求的結果是沒有更多數據。

例子:

如果讀者確實HTTP請求(http://whatever/resource?npag=1)獲得:

[{"item1":"content1"}....{"item500":"content500"}] 

由於500個項目組API進行分頁,我需要執行作業另一個時間,因爲可能我們有更多的數據。爲此,我更改資源中的npag參數(http://whatever/resource?npag=2)。

如果我得到的結果:

[] 

沒有更多的數據,所以我想停止執行作業。

我的方法: 我試圖設置ItemReader一個jobParameter,讓我知道在計劃程序,如果我能停止或沒有做的請求。但在ItemReader中,我只知道如何讀取作業參數(帶有註解@StepCope),但不知道如何設置它。

摘要:我需要知道一個變量從作業之外的ItemReader設置好的值(從執行該作業調度程序)

任何想法?謝謝,

SOLUTION:

由於@HansjoergWingeier建議,做itemReader內的所有請求可以解決問題:

private String npag = 1; 

@Override 
public String read() throws Exception { 

    Map<String, String> vars = new HashMap<>(); 

    while (npag > 0) { 
     vars.put("numPag", String.valueOf(npag)); 

     String result = restTemplate.getForObject(urlAPI, String.class, vars); 
     if ("[]".equals(result)) { 
      return null; 
     } else { 
      npag++; 
      return result; 
     } 
    } 
    return null; 
} 

回答

1

那豈不是更好地讓讀者閱讀,直到沒有什麼可以閱讀的?

它可能類似於此:

int page = 1; 
List<String> items; 

public String read() { 
if (items == null || items.isEmpty()) { 
    items = callResServiceToGetNextPackage(page); 
    pos 
    page++; 
    } 
    if (items.isEmpty()) { 
    return null; // this will end reading 
    } 
    String itemToReturn = items.removeFirst(): 
    return itemToReturn; 
} 

只要讀者返回null,作業將進入下一個步驟,最終終止作業。

+0

毫米好吧,所以你的意思是創建一個獨特的工作與步驟(和讀者),包括所有的要求,是嗎?我最初的想法是,這項工作是爲'npag'參數的每個值執行的,但我會考慮它。 – Emilio

相關問題