我爲spring批處理使用java配置(spring-boot)。我有一個員工ID列表,對於每個ID,我需要運行一個查詢(如下圖),然後處理數據。使用JdbcCursorItemReader進行動態SQL查詢
select * from history where employee_id = ?
我知道我們可以使用reader.setPreparedStatementSetter
來動態設置上述SQL中的參數。但是,我不確定如何重複列表中每個員工ID的批處理過程。即使我將reader()標記爲@StepScope,讀者也只會被調用一次。 (即),批次只運行一次。任何幫助表示讚賞。
List employeeIds = new ArrayList();
employeeIds.add(1);
employeeIds.add(2);
@Bean
@StepScope
public ItemReader<History> reader() {
JdbcCursorItemReader<History> databaseReader = new JdbcCursorItemReader<>();
databaseReader.setSql("select * from history where employee_id = ?");
databaseReader.setPreparedStatementSetter(..);
....
return databaseReader;
}
@Bean
public Step step(StepBuilder stepBuilder){
return stepBuilderFactory.get("sample").
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
這是一種常見模式(http://docs.spring.io/spring-batch/reference/html/patterns.html#drivingQueryBasedItemReaders)。您的閱讀器從ID列表中返回ID,並且您當前的閱讀器必須轉換爲處理器 –
嗯,可以將一個ItemReader映射到多個ItemProcessor嗎?因爲我希望ItemProcessor爲原始列表中的每個ID運行。 –
是的,使用複合物品處理器(http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/support/CompositeItemProcessor.html) –