使用spring batch

时间:2017-09-20 12:00:31

标签: java csv spring-batch

我是春季批次的新手,我想找到一个完美的方法来使用这里显示的用例:

我有多个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上的必要步骤吗?

1 个答案:

答案 0 :(得分:1)

在Spring Batch的面向大块的步骤中,定义了一个阅读器&amp; writer(作为步骤的一部分)是强制性的,但处理器是可选的。见here

然后您可以随时选择在组件中执行 NOTHING ,并始终可以在组件中执行任何操作,而不管名称(读取器,处理器或编写器)。

话虽如此,您还没有说明为什么要在阅读器或处理器中填充地图。不是作家?即你在编剧中填充地图会遇到哪些具体问题?

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

  

是否存在将所有csv文件存储在内存中的另一种方式/最佳方式   仅使用ItemReader或ItemProcessor,因为它是一个简单的获取数据   从文件到地图?

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

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

  

itemWriter是存储这些文件的必要步骤吗?   地图吗?

只要您相信分离的组件和SRP,这一点至关重要。

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

希望它有所帮助!!