我正在構建修改給定數量記錄的彈簧批處理作業。記錄ID列表是作業的輸入參數。例如,一項工作可能是:修改記錄ID {1,2,3,4}並在相關表上設置參數X和Y.編寫彈簧式批處理的正確方法ItemReader
因爲我無法將潛在的很長的輸入列表(tipical個案,50K記錄)傳遞給我的ItemReader,所以我只傳遞一個MyJobID,然後itemReader用來加載目標ID列表。
問題是,結果代碼出現「錯誤」(雖然它的工作原理),而不是春季批次的精神。這裏的讀者:
@Scope(value = "step", proxyMode = ScopedProxyMode.INTERFACES)
@Component
public class MyItemReader implements ItemReader<Integer> {
@Autowired
private JobService jobService;
private List<Integer> itemsList;
private Long jobId;
@Autowired
public MyItemReader(@Value("#{jobParameters['jobId']}") final Long jobId) {
this.jobId = jobId;
this.itemsList = null;
}
@Override
public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
// First pass: Load the list.
if (itemsList == null) {
itemsList = new ArrayList<Integer>();
MyJob myJob = (MyJob) jobService.loadById(jobId);
for (Integer i : myJob.getTargedIdList()) {
itemsList.add(i);
}
}
// Serve one at a time:
if (itemsList.isEmpty()) {
return null;
} else {
return itemsList.remove(0);
}
}
}
我試圖read()方法的第一部分移動到構造,但@Autowired引用是空在這一點上。之後(在讀取方法上),它被初始化。
有沒有更好的方法來編寫ItemReader?我想移動「負載」或者這是該場景的最佳解決方案?
謝謝。
顯示jobService.loadById()的代碼,我會回來反饋。 –