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

标签 java csv spring-batch

我是 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/

相关文章:

python - 将 mysql 数据导出到 csv 时不要将 NULL 值转换为空字符串

jackson - 从 Spring Batch 3 迁移到 4

java - 如何将 Spring Security 与 Spring Batch 集成?

java - 无法加载 JDBC 驱动程序类 - Spring Batch 独立程序

java - 如何仅对某些事物使用 Graphics2D g.scale() 而对其他事物不使用?

java - 为什么添加一行计算会减少运行时间?

java - 更改工具栏概述的文本颜色

python - 在 Python 和 Pandas 中使用 dd.mm.yyyy 读取 csv

java - 使用 JPA 在 PostgreSQL 中持久化 UUID

java - 如何在 Java 中检查 null 分隔值?