我是春季批次的新手,我想找到一个完美的方法来使用这里显示的用例:
我有多个csv文件,我想将它们存储在内存中(作为Collection Store ..即List List)然后我想在我的逻辑业务的后续步骤/作业中使用/引用它们。
让我们举一个例子,用ItemWriter存储在Map上的对象XX。
对象XX模型
public class Object {
private int x;
private int y;
// getters setters
}
对象X的itemReader
public class ObjectItemReader extends FlatFileItemReader<Object> {
public ObjectItemReader() {
this.setResource(new ClassPathResource("xxx.csv"));
this.setLineMapper(new DefaultLineMapper<Object>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[] { "x", "y" });
setDelimiter(DELIMITER_TAB);
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Object>() {{
setTargetType(Object.class);
}});
}});
}
}
ObjectWriter
public class ObjectItemWriter implements ItemWriter<Object> {
private Map<Long , Object> objectMap;
public ObjectItemWriter() {
System.out.println("Map Store is created ");
objectMap= new HashMap<Long , Object>();
}
@Override
public void write(List<? extends Object> items) throws Exception {
for (Object depot : items) {
objectMap.put(depot.getX(), depot);
}
}
public Map<Long , Object> getobjectMap() {
return objectMap;
}
}
正如您可以看到所有记录都使用itemWriter存储在Map中,我使用一个简单的tasklet进行测试,以便在其他步骤中访问此Map
public class TaskletStep implements Tasklet{
@Autowired
private ObjectItemWriter objectItemWriter;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println(objectItemWriter.getobjectMap().size());
return null;
}
}
我的问题,
是否有另一种方法/最佳方式将所有csv文件存储在内存中 仅使用ItemReader或ItemProcessor,因为它可以简单地将数据从文件传输到Map?
itemWriter是将这些文件存储在Map上的必要步骤吗?
答案 0 :(得分:1)
在Spring Batch的面向大块的步骤中,定义了一个阅读器&amp; writer(作为步骤的一部分)是强制性的,但处理器是可选的。见here
然后您可以随时选择在组件中执行 NOTHING ,并始终可以在组件中执行任何操作,而不管名称(读取器,处理器或编写器)。
话虽如此,您还没有说明为什么要在阅读器或处理器中填充地图。不是作家?即你在编剧中填充地图会遇到哪些具体问题?
在我看来,如果您选择了Spring Batch,则必须按照预定义和假设流程设计程序,以获得干净的代码和干净的设计。从这个角度来看,您当前的方法看起来比您计划的要好。
是否存在将所有csv文件存储在内存中的另一种方式/最佳方式 仅使用ItemReader或ItemProcessor,因为它是一个简单的获取数据 从文件到地图?
如前所述,您可以在处理器中填充地图,并让编写器不执行任何操作。你必须注意 chunking 无论如何都会发生,控制权将转到writer来提交事务。在我看来,如果您不希望在写入之前转换读取项目,只需省略处理器并直接从读取器发送项目到作者(以块为单位)。
通过在阅读器中填充地图,您将违反单一责任原则(SRP),这是不可取的。
itemWriter是存储这些文件的必要步骤吗? 地图吗?
只要您相信分离的组件和SRP,这一点至关重要。
如果单个组件可以完成这项任务,为什么有人需要三个组件?
您的问题让我怀疑为什么我们甚至需要Spring Batch API / Framework(只使用 - FlatFileItemReader
类?)?
希望它有所帮助!!