java—我想将第一步的数据传递给第二步的读取器

t5zmwmid  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(273)

我使用spring批处理来执行以下工作流程:
步骤1:读取一个大的csv并将其放入Map中
第二步:从前面的Map我要做一个业务逻辑。
我创建了一个名为coursecsvrepository的bean,以便将Map的csv保存到此Map(singletonbean):

@Component
public class CourseCsvRepository {

    private Map<String, List<Course>> courseMappedByKey = new HashMap<>();

    public void addToMap(Course course){

        String key = "";
        key= key.concat(String.valueOf(course.getCodeStifLigne())).concat(course.getAntenne()).concat(String.valueOf(course.getIdtm())).concat(String.valueOf(course.getIdmiss())).concat(String.valueOf(course.getCourse())).concat(course.getNommiss());

        if(courseMappedByKey.containsKey(key)){
            courseMappedByKey.get(key).add(course);
        }else {
            final ArrayList<Course> list = new ArrayList<>();
            list.add(course);
            courseMappedByKey.put(key, list);
        }
    }

    public Map<String, List<Course>> getMap(){
        return this.courseMappedByKey;
    }

    public List<Course> getByKey(String key){
        return this.courseMappedByKey.get(key);
    }

}

我的第二个读者(步骤2)如下:

@Bean
public ItemReader<List<Course>> readFromMap(){

    ListItemReader<List<Course>> reader = new ListItemReader<List<Course>>(new ArrayList(courseCsvRepository.getMap().values()));

    return reader;
}

但是coursecsvrepository.getmap()总是返回null,因为我的bean是在执行步骤1之前创建的(用于填充我们的Map)

@Bean
public Job writeCsvToDbJob() {
    return jobBuilderFactory.get("writeCsvToDbJob")
            .incrementer(new RunIdIncrementer())
            .start(step1())
            .next(step2())
            .build();
}
axr492tv

axr492tv1#

我想和大家分享一下前一个问题的答案:
我的bean需要有步骤范围,以便它们能够在每个步骤接收stepexecutioncontext参数。如果它们不在步骤范围内,那么它们的bean将在最初创建,并且不接受步骤级别的填充Map。
@stepscope:spring批处理stepscope是如何工作的

@Bean
@StepScope
public ItemReader<List<Course>> readFromMap(){

    ListItemReader<List<Course>> reader = new ListItemReader<List<Course>>(new ArrayList(courseCsvRepository.getMap().values()));

    return reader;
}

相关问题