Sam*_*ont 5 java spring spring-batch
我正在使用Spring Batch设置作业服务器。我的JdbcCursorItemReader需要使用sql进行配置,该sql会根据每个作业的运行情况进行更改。因为sql发生了变化,所以我希望读者拥有@StepScope,所以我不必担心sql的有状态性。
所以我设置了一个像这样的类:
public class ParameterSettingJdbcCursorItemReader extends JdbcCursorItemReader implements StepExecutionListener {
@Override
public void beforeStep(StepExecution stepExecution) {
JobParameters jobParameters = stepExecution.getJobParameters();
if (jobParameters != null) {
List<Object> args = new ArrayList<Object>();
for (JobParameter jobParameter : jobParameters.getParameters().values()) {
args.add(jobParameter.getValue());
}
Object[] arrayArgs = args.toArray(new Object[args.size()]);
String sql = String.format(getSql(), arrayArgs);
setSql(sql);
}
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是我通过JobParameters将sql参数传递给对象,并使用String.format来填充动态变化的sql。
我在整个服务器上使用基于Java的配置。我的ItemReader实例的bean如下所示:
@Bean
@StepScope
public ItemReader<MyInputObject> myInputObjectItemReader() {
ParameterSettingJdbcCursorItemReader itemReader = new ParameterSettingJdbcCursorItemReader();
itemReader.setDataSource(myDataSource());
itemReader.setSql("SELECT * FROM my_table WHERE date = '%1$s'");
itemReader.setRowMapper(myInputObjectMapper);
return itemReader;
}
Run Code Online (Sandbox Code Playgroud)
当我启动服务器并运行Spring Batch作业时,出现以下错误: java.lang.IllegalStateException: No Scope registered for scope 'step'
我在其他地方读过,为了能够使用StepScope,首先需要将其添加到xml应用程序配置中,如下所示:
<bean class="org.springframework.batch.core.scope.StepScope" />
但是由于我使用的是基于Java的配置,所以这不是一个选择。
那么,如何通过基于Java的配置注册StepScope?我已经试过了:
@Bean
public org.springframework.batch.core.scope.StepScope stepScope() {
return new org.springframework.batch.core.scope.StepScope();
}
Run Code Online (Sandbox Code Playgroud)
...但是当我这样做时,我会在应用程序启动期间在与StepScope无关的bean上获得各种NPE。
提前致谢。
您必须使用 注册范围ApplicationContext。通常,当您使用 时,就会为您完成@EnableBatchProcessing。您是否这样做了(将该注释添加到您的其中之一@Configurations)?
| 归档时间: |
|
| 查看次数: |
10249 次 |
| 最近记录: |