【发布时间】:2018-03-15 11:26:39
【问题描述】:
我知道我可以直接从第 1 步读取文件,在将 sql 查询设置到阅读器之前的片刻,但我想将读取查询的过程与数据库读取分开。
这是我的工作配置。
@Configuration
public class BatchConfiguration {
[...]
@Bean
@StepScope
public JdbcCursorItemReader<Map<String, Object>> dynamicSqlItemReader() {
JdbcCursorItemReader<Map<String, Object>> jir = new JdbcCursorItemReader<>();
jir.setSql((String) contextHolder.getContext().get("fileContent"));
jir.setDataSource(dataSource);
jir.setRowMapper(new ColumnMapRowMapper());
return jir;
}
private FlatFileItemReader<String> flatFileItemReader() {
[...]
}
private ItemWriter<? super String> sysoItemWriter() {
return (ItemWriter<String>) list -> {
for (String element : list) {
System.out.println(element);
}
contextHolder.getContext().put("fileContent", list.get(0));
};
}
@Bean
public ItemWriter<Map<String, Object>> customerItemWriter() {
return list -> {
for (Map<String, Object> stringObjectMap : list) {
System.out.println(stringObjectMap);
}
};
}
@Bean
public Step step0() {
return stepBuilderFactory.get("step0")
.<String, String>chunk(1)
.reader(flatFileItemReader())
.writer(sysoItemWriter())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<Map<String, Object>, Map<String, Object>>chunk(10)
.reader(dynamicSqlItemReader())
.writer(customerItemWriter())
.build();
}
@Bean
public Job job() throws Exception {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.start(step0())
.next(step1())
.build();
}
}
这会引发java.lang.IllegalArgumentException: The SQL query must be provided,因为在设置查询时contextHolder.getContext().get("fileContent") 仍然是null。
【问题讨论】:
-
数据库查询在做什么?
-
我不知道先验:sql 查询的路径将是一个批处理参数。但基本上他们是
select。 -
您使用的是哪个 contextHolder?
-
这是我的一个包含 Map
的 bean。
标签: spring spring-boot spring-batch