Java 根据spring批处理中的参数,在不同的步骤之间进行选择
我正在使用SpringBatch编写一个应用程序,从表中读取数据,然后将输出写入csv文件。应用程序接收多个输入参数,其中一个是要读取的数据库表。我想编写一个作业,根据输入参数读取正确的表。这是我的配置类: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(
@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类。