Spring batch JdbcCursorItemReader方法下的Spring批处理4.0~代码不';t在定义了@StepScope的情况下运行
我在批处理作业中定义了一个sql查询,需要在运行时从用户处获取输入 我在批处理作业中定义了以下条目读取器,如下所示Spring batch JdbcCursorItemReader方法下的Spring批处理4.0~代码不';t在定义了@StepScope的情况下运行,spring-batch,Spring Batch,我在批处理作业中定义了一个sql查询,需要在运行时从用户处获取输入 我在批处理作业中定义了以下条目读取器,如下所示 @StepScope @Bean public JdbcCursorItemReader<QueryCount> queryCountItemReader() throws Exception { ListPreparedStatementSetter preparedStatementSetter = new ListPreparedStatementSet
@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 {
@StepScope
@豆子
公共JdbcCursorItemReader queryCountItemReader(@Value(“#{jobParameters['fromDate']}”)字符串fromDate,
@值(“#{jobParameters['toDate']}”)字符串toDate,
@值(“#{jobParameters['eventType']}”)字符串eventType,
@值(“#{jobParameters['businessUnit']}”)字符串businessUnit,
@值(“#{jobParameters['deviceCategory']}”)字符串deviceCategory,
@值(“#{jobParameters['NumberOfSearchId']}”)字符串NumberOfSearchId)引发异常{