spring-batch - Spring Batch 4.0 ~ JdbcCursorItemReader 方法下的代码未在定义@StepScope 的情况下运行
问题描述
我在批处理作业中定义了一个 sql 查询,需要在运行时从用户那里获取输入。
我的批处理作业中有以下项目阅读器,定义如下
@StepScope
@Bean
public JdbcCursorItemReader<QueryCount> queryCountItemReader() throws Exception {
ListPreparedStatementSetter preparedStatementSetter = new ListPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement pstmt) throws SQLException {
pstmt.setString(1, "#{jobparameters[fromDate]}");
pstmt.setString(2, "#{jobparameters[toDate]}");
pstmt.setString(3, "#{jobparameters[fromDate]}");
pstmt.setString(4, "#{jobparameters[toDate]}");
pstmt.setString(5, "#{jobparameters[fromDate]}");
pstmt.setString(6, "#{jobparameters[toDate]}");
pstmt.setString(7, "#{jobparameters[eventType]}");
pstmt.setString(8, "#{jobparameters[businessUnit]}");
pstmt.setString(9, "#{jobparameters[deviceCategory]}");
pstmt.setString(10, "#{jobparameters[numberOfSearchIds]}");
}
};
JdbcCursorItemReader<QueryCount> queryCountJdbcCursorItemReader = new JdbcCursorItemReader<>();
queryCountJdbcCursorItemReader.setDataSource(dataSource);
queryCountJdbcCursorItemReader.setSql(sqlQuery);
queryCountJdbcCursorItemReader.setRowMapper(new QueryCountMapper());
queryCountJdbcCursorItemReader.setPreparedStatementSetter(preparedStatementSetter);
int counter = 0;
ExecutionContext executionContext = new ExecutionContext();
queryCountJdbcCursorItemReader.open(executionContext);
try {
QueryCount queryCount;
while ((queryCount = queryCountJdbcCursorItemReader.read()) != null) {
System.out.println(queryCount.toString());
counter++;
}
}catch (Exception e){
e.printStackTrace();
}finally {
queryCountJdbcCursorItemReader.close();
}
return queryCountJdbcCursorItemReader;
}
我正在从我的应用程序类中发送作业参数,如下所示
JobParameters jobParameters = new JobParametersBuilder()
.addString("fromDate", "20180410")
.addString("toDate", "20180410")
.addString("eventType", "WEB")
.addString("businessUnit", "UPT")
.addString("numberOfSearchIds", "10")
.toJobParameters();
JobExecution execution = jobLauncher.run(job, jobParameters);
问题是,当我运行批处理作业时,queryCountItemReader() 方法中的代码永远不会执行,并且作业完成时没有错误。本质上,我试图运行的 sql 查询永远不会执行。如果我删除 @StepScope 注释,则代码将运行但会失败并出现错误,因为它可以将从应用程序类发送的参数绑定到 sql 查询。我意识到@StepScope 是使用作业参数所必需的,但为什么我的方法中的代码不执行?
解决方案
通过添加@EnableBatchProcessing
&@EnableAutoConfiguration
注释和更改项目阅读器方法定义解决了这个问题,如下所示,
@StepScope
@Bean
public JdbcCursorItemReader<QueryCount> queryCountItemReader(@Value("#{jobParameters['fromDate']}") String fromDate,
@Value("#{jobParameters['toDate']}") String toDate,
@Value("#{jobParameters['eventType']}") String eventType,
@Value("#{jobParameters['businessUnit']}") String businessUnit,
@Value("#{jobParameters['deviceCategory']}") String deviceCategory,
@Value("#{jobParameters['numberOfSearchIds']}") String numberOfSearchIds) throws Exception {
推荐阅读
- javascript - 通过使用Angularjs单击复选框来显示和隐藏表格中的列
- laravel - 在一个模型中调用 2 个连接函数
- r - R - 逻辑回归 - 模型预测和拆分数据非常糟糕。想法?
- angular - 材料表数据源内的Angular 7下拉列表正在选择数组的最后一项
- spring-boot - 如何使用 JPA 计算列的平均值?
- sql-server - 如何检查列中的值是否更新?
- sql - 如何在 SQL 中汇总按财政年度分组的数据
- php - 数组只插入一行
- postgresql - 使用 Docker Compose Psql 进行 Knex 迁移
- javascript - 如何使用ajax以编程方式在嵌套模式对话框中更改引导选择2中的默认选择选项?