我有一个Spring Batch程序,该程序从DB读取数据并进行处理,然后(使用ItemWriter)插入数据库的其他表中。在这里,我对ItemReader,ItemProcessor和ItemWriter使用了一堆SQL查询。
我的要求是将所有这些查询存储在具有参数和值格式的表中,并通过单个DB调用对其进行检索,并将其传递给ItemReader或ItemProcessor或ItemrWriter。因此,如果将来查询中有任何更改,我们最终将只进行数据库更新,而代码将保持不变。
我尝试在beforeJob部分中进行操作,但是我遇到错误,提示“ java.lang.IllegalArgumentException:必须提供SQL查询”。但是我可以通过在ItemReader方法内进行数据库调用来成功完成此操作。我试图避免这种方法,因为我需要为每个ItemReader,ItemProcessor和ItemWriter进行数据库调用。请让我知道如何实现此目标?
答案 0 :(得分:1)
您可以创建一个带有Tasklet的步骤,该Tasklet从数据库中读取查询并将其添加到某个键下的执行上下文中,然后使用来自执行上下文的查询来配置面向块的步骤的读取器。这是一个简单的示例:
@Bean
public Tasklet queryRetrievalTasklet() {
return (contribution, chunkContext) -> {
String query = ""; // retrieve query from db (using a JdbcTemplate for example)
chunkContext.getStepContext().getJobExecutionContext().put("query", query);
return RepeatStatus.FINISHED;
};
}
@Bean
@StepScope
public ItemReader<Integer> itemReader(@Value("#{jobExecutionContext['query']}") String query) {
// return your reader configured with the query
return null;
}
希望这会有所帮助。
答案 1 :(得分:0)
我认为,这种配置通常是通过将查询存储在属性而不是数据库中来完成的。喜欢:
<div class="card text-center">
Full name is: {{ fullname }}
</div>