Java 根据spring批处理中的参数,在不同的步骤之间进行选择

Java 根据spring批处理中的参数,在不同的步骤之间进行选择,java,spring,spring-boot,spring-batch,Java,Spring,Spring Boot,Spring Batch,我正在使用SpringBatch编写一个应用程序,从表中读取数据,然后将输出写入csv文件。应用程序接收多个输入参数,其中一个是要读取的数据库表。我想编写一个作业,根据输入参数读取正确的表。这是我的配置类: @Configuration public class ExtractorConfiguration { @Bean(name="readerA") @StepScope public JdbcCursorItemReader<ClassA> readerA(

我正在使用SpringBatch编写一个应用程序,从表中读取数据,然后将输出写入csv文件。应用程序接收多个输入参数,其中一个是要读取的数据库表。我想编写一个作业,根据输入参数读取正确的表。这是我的配置类:

@Configuration
public class ExtractorConfiguration {

@Bean(name="readerA")
@StepScope
public JdbcCursorItemReader<ClassA> readerA(
        @Value("#{jobParameters['REF_DATE']}")String dataRef
){
    ...
    return reader;
}

@Bean(name="writerA")
@StepScope
public FlatFileItemWriter<ClassA> writerA(
        @Value("#{jobParameters['OUTPUT_FILE_PATH']}")String outputPath
) {
    ...
    return writer;
}

//endregion

@Bean(name="extractStep")
@StepScope
public Step extractStep(
        @Value("#{jobParameters['DATABASE_TABLE']}")String tableName
) throws Exception {
    switch (tableName) {
        case tableA:
            return steps.get("extractStep")
                    .<ClassA, ClassA>chunk(applicationProperties.getChunkSize())
                    .reader(readerA(""))
                    .writer(writerA(""))
                    .build();

        default:
            throw new Exception("Wrong table: " + tableName);
    }

}


@Bean(name = "myJob")
public Job myJob() throws Exception {
    return jobs.get("myJob")
            .flow(extractStep(""))
            .end()
            .build();
}

}
想法是在开关中添加第二个案例,如下所示:

case tableB:

            return steps.get("extractStep")
                    .<ClassB, ClassB>chunk(applicationProperties.getChunkSize())
                    .reader(readerB(""))
                    .writer(writerB(""))
                    .build();
然后为readerB和writerB编写和执行方法;通过这种方法,我收到了这个错误:

原因:java.lang.IllegalStateException:没有可用于步骤范围的上下文持有者

我想知道: 1-错误是什么? 2-是否有一种方法可以在myJob中而不是在步骤中获取JobParameters? 3-是否有更好的方法?
谢谢。

您的配置中似乎没有定义范围步骤,添加@EnabeBatchProcessing应该可以解决这个问题,因为它会自动添加范围步骤。也就是说,您如何定义应该从动态表中提取哪些列?这些是否也作为参数传入,或者您将执行类似于选择*。。。。选择*。。方法,目标类型DccDettTrim是否足够通用,可以从所有表映射?如果您有合理数量的表,我会保持简单,并为每个表创建一个作业;不幸的是,我已经尝试添加@EnableBatchProcessing注释,但错误仍然存在。在我看来,readerB和writerB使用其他目标类型。B类。