gpt4 book ai didi

java - 使用 spring batch 在 Map 上存储文件的最佳实践

转载 作者:行者123 更新时间:2023-11-30 10:25:18 29 4
gpt4 key购买 nike

我是 spring batch 的新手,我想找到与用例一起使用的完美方法,如下所示:

我有多个 csv 文件,我想将它们存储在内存中(作为 Collection Store .. 即 List Map),然后我想在我的逻辑业务的后续步骤/工作中使用/引用它们。

让我们举一个例子,一个对象 XX 存储在带有 ItemWriter 的 Map 上。

对象 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);
}});
}});
}
}

对象编写器

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 的必要步骤吗?

最佳答案

在 Spring Batch 的面向 block 的步骤中,定义读写器(作为步骤的一部分)是强制性的,但处理器是可选的。参见 here

然后您始终可以选择在组件中执行 - NOTHING 并且始终可以在组件中执行任何您想执行的操作,而不管名称(读取器、处理器或写入器)如何。

话虽如此,您还没有说明为什么要在读取器或处理器中而不是在写入器中填充 map ?即通过在 writer 中填充 map ,您面临哪些具体问题?

在我看来,如果您选择了 Spring Batch,则必须按照预定义和假设的流程设计您的程序,以获得干净的代码和干净的设计。从这个角度来看,您当前的方法看起来比您计划的要好。

is there another way / best way to store all csv files on memory with using only ItemReader or ItemProcessor as it's a simple getting data from files to Map?

如前所述,您可以在处理器中填充 map ,并让编写器不执行任何操作。您必须注意,chunking 无论如何都会发生,控制权将交给 writer 以提交事务。在我看来,如果您不想在写入之前转换读取的项目,只需省略处理器并将项目直接从读取器发送到写入器(以 block 的形式)。

通过在阅读器中填充 map ,您将违反单一职责原则 (SRP),这是不可取的。

Is that the itemWriter is an essential step to store these filed on Map?

只要您相信解耦组件和 SRP,它就是必不可少的。

如果单个组件可以完成工作,为什么有人需要三个组件?你的问题让我质疑为什么我们甚至需要 Spring Batch API/Framework(只使用 - FlatFileItemReader 类?)?

希望对您有所帮助!!

关于java - 使用 spring batch 在 Map 上存储文件的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46321500/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com