Java Spring批处理延迟步骤初始化

Java Spring批处理延迟步骤初始化,java,spring,spring-batch,jobs,Java,Spring,Spring Batch,Jobs,我有一个带有两个步骤的Spring批处理作业。第一个下载文件,第二个处理文件。问题是第二步在第一步运行之前不知道文件名 作业已自动实例化这些步骤,以便在需要时运行。我想不出任何方法来确保在第一步运行之后该步骤会初始化 代码如下: @Bean public Job insertIntoDbFromCsvb(){ return jobs.get("Insert Entity Records Job") .incrementer(new RunIdIncreme

我有一个带有两个步骤的Spring批处理作业。第一个下载文件,第二个处理文件。问题是第二步在第一步运行之前不知道文件名

作业已自动实例化这些步骤,以便在需要时运行。我想不出任何方法来确保在第一步运行之后该步骤会初始化

代码如下:

    @Bean
public Job insertIntoDbFromCsvb(){
    return jobs.get("Insert Entity Records Job")
            .incrementer(new RunIdIncrementer())
             .listener(new InsertRecordListener())
            .start(downloadFileStep())
            .next(insertIntoDBStep())
            .build();
}

@Bean
ItemProcessor<Entity, Entity> csvEntityProcessor() {
    return new EntityItemProcessor();
}

@Bean
public Step insertIntoDBStep(){
    return steps.get("Insert Entity Records Step")
            .<Entity, Entity>chunk(500)
            .reader(csvFileReader())
            .processor(csvEntityProcessor())
            .writer(itemWriter())
            .build();
}

@Bean
public Step downloadFileStep(){
    return steps.get("Download File Step")
            .tasklet(new DownloadFileTasklet("https://leidata-preview.gleif.org/storage/golden-copy-files/2018/06/14/49694/20180614-0000-gleif-goldencopy-lei2-golden-copy.csv.zip",
                    fileDao,
                    FileAction.INIT_ENTITY,
                    this))
            .allowStartIfComplete(true)
            .build();
}

@Bean
public FlatFileItemReader<Entity> csvFileReader(){
    System.out.println("file name: " + fileName);
    FlatFileItemReader<Entity> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("data/"+this.fileName));
    reader.setStrict(false);
    reader.setLinesToSkip(1);
    reader.setLineMapper(lineMapper());

    return reader;
}
@Bean
公共作业insertIntoDbFromCsvb(){
return jobs.get(“插入实体记录作业”)
.incrementer(新的RunIdIncrementer())
.listener(新的InsertRecordListener())
.start(下载文件步骤())
.next(insertIntoDBStep())
.build();
}
@豆子
ItemProcessor csvEntityProcessor(){
返回新的EntityItemProcessor();
}
@豆子
公共步骤insertIntoDBStep(){
return steps.get(“插入实体记录步骤”)
.chunk(500)
.reader(csvFileReader())
.processor(csvEntityProcessor())
.writer(itemWriter())
.build();
}
@豆子
公共步骤下载文件步骤(){
return steps.get(“下载文件步骤”)
.tasklet(新的下载文件tasklet(“https://leidata-preview.gleif.org/storage/golden-copy-files/2018/06/14/49694/20180614-0000-gleif-goldencopy-lei2-golden-copy.csv.zip",
fileDao,,
FileAction.INIT_实体,
这个)
.allowStartIfComplete(真)
.build();
}
@豆子
公共FlatFileItemReader csvFileReader(){
System.out.println(“文件名:”+文件名);
FlatFileItemReader=新的FlatFileItemReader();
setResource(新类路径资源(“data/”+this.fileName));
reader.setStrict(假);
reader.setLinesToSkip(1);
setLineMapper(lineMapper());
返回读取器;
}

您可以看到
reader.setResource(newclasspathResource(“data/”+this.fileName))
获取我在第一步的Tasklet中设置的局部变量
fileName

后期绑定由Spring批处理,您必须将bean的范围设置为
步骤

使用XML:

<bean id="myReader" scope="step"...>

文档:

也许您可以使用作业执行上下文发送文件名的值,并在第二步中检索它?@Thoomas问题是在第一步运行之前调用并准备csvFileReader。因此它已经获得了文件名值。后期绑定由spring批处理将bean的作用域设置为
step
(基于java的:@StepScope)@Thoomas谢谢你的努力:再见!我会把答案贴出来作为答案。
@StepScope