我使用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();
}
1条答案
按热度按时间axr492tv1#
我想和大家分享一下前一个问题的答案:
我的bean需要有步骤范围,以便它们能够在每个步骤接收stepexecutioncontext参数。如果它们不在步骤范围内,那么它们的bean将在最初创建,并且不接受步骤级别的填充Map。
@stepscope:spring批处理stepscope是如何工作的