我们正在创建一个Spring Batch应用程序,该应用程序从数据库中读取数据并写入另一个数据库中。在此过程中,我们需要将参数动态设置为SQL,因为我们有需要相应数据的参数。
为此,我们用@StepScope创建了一个JdbcCursorItemReader Reader,正如我在其他文章和教程中所发现的那样。但是没有成功。 Job中的块读取器实际上使用了Peekable阅读器,该内部使用JdbcCursorItemReader对象执行实际的读取操作。
当作业被触发时,我们得到错误-“在BeanExpressionContext类型的对象上找不到jobParameters”
请让我知道我在下面的bean配置中做错了什么。
@Bean
@StepScope
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public JdbcCursorItemReader<DTO> jdbcDataReader(@Value() String param) throws Exception {
JdbcCursorItemReader<DTO> databaseReader = new JdbcCursorItemReader<DTO>();
return databaseReader;
}
// This class extends PeekableReader, and sets JdbcReader (jdbcDataReader) as delegate
@Bean
public DataPeekReader getPeekReader() {
DataPeekReader peekReader = new DataPeekReader();
return peekReader;
}
// This is the reader that uses Peekable Item Reader (getPeekReader) and also specifies chunk completion policy.
@Bean
public DataReader getDataReader() {
DataReader dataReader = new DataReader();
return dataReader;
}
// This is the step builder.
@Bean
public Step readDataStep() throws Exception {
return stepBuilderFactory.get("readDataStep")
.<DTO, DTO>chunk(getDataReader())
.reader(getDataReader())
.writer(getWriter())
.build();
}
@Bean
public Job readReconDataJob() throws Exception {
return jobBuilderFactory.get("readDataJob")
.incrementer(new RunIdIncrementer())
.flow(readDataStep())
.end()
.build();
}
答案 0 :(得分:0)
请让我知道我在下面的bean配置中做错了什么。
您的jdbcDataReader(@Value() String param)
不正确。您需要在@Value
中指定Spel表达式,以指定要注入的参数。这是一个如何将作业参数传递给JdbcCursorItemReader
的示例:
@Bean
@StepScope
public JdbcCursorItemReader<DTO> jdbcCursorItemReader(@Value("#{jobParameters['table']}") String table) {
return new JdbcCursorItemReaderBuilder<DTO>()
.sql("select * from " + table)
// set other properties
.build();
}
您可以在参考文档的late binding部分中找到更多详细信息。