我为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) –