如何使用基于Java的配置来配置Spring Batch StepScope?

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。

提前致谢。

Dav*_*yer 3

您必须使用 注册范围ApplicationContext。通常,当您使用 时,就会为您完成@EnableBatchProcessing。您是否这样做了(将该注释添加到您的其中之一@Configurations)?