• SpringBatch reader详解


    Spring Batch 是一个用于大规模批处理任务的框架,提供了许多构建批处理应用程序的功能。ItemReader 是 Spring Batch 中的一个关键接口,用于读取输入数据源中的数据。

    一、ItemReader基本概念

    1、ItemReader 接口: ItemReader 是 Spring Batch 中用于读取数据的接口。它定义了一个 read 方法,用于读取数据,并返回一个数据项。数据项通常是 Java 对象,可以是从文件、数据库、消息队列等数据源中读取的。

    1. public interface ItemReader {
    2. T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException;
    3. }

    2、常见的 ItemReader 实现: Spring Batch 提供了许多常见数据源的 ItemReader 实现,包括:

    • FlatFileItemReader: 用于从文本文件中读取数据,支持各种文本文件格式,如 CSV、XML 等。
    • JdbcCursorItemReader: 用于从数据库中读取数据,支持基于游标的数据读取,适用于大量数据的情况。
    • JpaPagingItemReader: 用于从 JPA 数据源中读取数据,支持分页读取数据。
    • HibernateCursorItemReader: 用于从 Hibernate 数据源中读取数据,支持游标式读取。
    • Custom ItemReader: 你可以根据自己的需求实现自定义的 ItemReader。

    3、读取数据并返回: ItemReader 的 read 方法用于读取数据,返回的数据通常是一个 Java 对象。如果没有更多数据可读,可以返回 null,这通常表示数据读取已经完成。

    4、异常处理: read 方法可能会抛出异常,如 ParseException(解析异常)、NonTransientResourceException(非瞬态资源异常)等。在异常处理方面,Spring Batch 提供了灵活的配置选项,可以处理不同类型的异常,并执行相应的操作。

    5、状态管理: ItemReader 可以管理读取的状态,以确保在故障发生时能够从上次中断的位置继续读取数据。这通常通过配置 saveState 来实现,以便在作业执行期间保持状态。

    6、Chunk 处理: Spring Batch 通常将 ItemReader 与 ItemProcessor 和 ItemWriter 一起使用,以处理数据的块。Chunk 是 Spring Batch 中一次处理的数据单元,可以包含多个数据项。ItemReader 负责读取 Chunk 中的数据项。

    二、使用 FlatFileItemReader 从文本文件中读取数据

    1. @Configuration
    2. @EnableBatchProcessing
    3. public class BatchConfiguration {
    4. @Autowired
    5. private JobBuilderFactory jobBuilderFactory;
    6. @Autowired
    7. private StepBuilderFactory stepBuilderFactory;
    8. @Bean
    9. public FlatFileItemReader reader() {
    10. FlatFileItemReader reader = new FlatFileItemReader<>();
    11. reader.setResource(new ClassPathResource("sample-data.csv"));
    12. reader.setLineMapper(new DefaultLineMapper() {{
    13. setLineTokenizer(new DelimitedLineTokenizer() {{
    14. setNames(new String[] { "firstName", "lastName" });
    15. }});
    16. setFieldSetMapper(new BeanWrapperFieldSetMapper() {{
    17. setTargetType(Person.class);
    18. }});
    19. }});
    20. return reader;
    21. }
    22. @Bean
    23. public Job importUserJob(JobCompletionNotificationListener listener) {
    24. return jobBuilderFactory.get("importUserJob")
    25. .incrementer(new RunIdIncrementer())
    26. .listener(listener)
    27. .flow(step1())
    28. .end()
    29. .build();
    30. }
    31. @Bean
    32. public Step step1() {
    33. return stepBuilderFactory.get("step1")
    34. .chunk(10)
    35. .reader(reader())
    36. .processor(processor())
    37. .writer(writer())
    38. .build();
    39. }
    40. // ...
    41. }

    三、FlatFileItemReader 详解

    FlatFileItemReader 是 Spring Batch 中用于从文本文件读取数据的实现之一。它用于读取扁平文件(Flat Files),如 CSV、TSV 等格式的数据。

    在 Spring Batch 的配置中,通过 Java 配置或 XML 配置来创建并配置 FlatFileItemReader。以下是一个 Java 配置示例:

    1. @Bean
    2. public FlatFileItemReader reader() {
    3. FlatFileItemReader reader = new FlatFileItemReader<>();
    4. reader.setResource(new ClassPathResource("sample-data.csv"));
    5. reader.setLineMapper(new DefaultLineMapper() {{
    6. setLineTokenizer(new DelimitedLineTokenizer() {{
    7. setNames(new String[] { "firstName", "lastName" });
    8. }});
    9. setFieldSetMapper(new BeanWrapperFieldSetMapper() {{
    10. setTargetType(Person.class);
    11. }});
    12. }});
    13. return reader;
    14. }

    在上面的配置中,我们创建了一个 FlatFileItemReader 并设置了以下属性:

    • setResource:指定要读取的文本文件,可以是文件系统路径、URL、类路径资源等。
    • setLineMapper:设置行映射器,用于将文件中的每一行数据映射到领域对象上。在这里,我们使用 DefaultLineMapper,并配置了 LineTokenizerFieldSetMapper
    • LineTokenizer:用于指定如何拆分每行的数据。这里使用了 DelimitedLineTokenizer 来指定分隔符。
    • FieldSetMapper:将拆分的字段映射到领域对象的属性上,这里使用了 BeanWrapperFieldSetMapper
    1. 数据映射: 在上述配置中,我们使用 DefaultLineMapperDelimitedLineTokenizerBeanWrapperFieldSetMapper 来进行数据映射。具体来说,DelimitedLineTokenizer 拆分每一行数据,BeanWrapperFieldSetMapper 将拆分的字段映射到一个领域对象 Person 中。你可以根据实际需求调整映射的方式。

    2. 处理异常: 在使用 FlatFileItemReader 时,需要注意异常处理。例如,如果读取的数据不符合预期的格式,可能会抛出异常。Spring Batch 提供了异常处理机制,可以配置如何处理这些异常。

    3. 状态管理: FlatFileItemReader 通常会管理读取的状态,以确保在故障发生时能够从上次中断的位置继续读取数据。这可以通过配置 saveState 来实现。

    FlatFileItemReader 是 Spring Batch 中用于读取扁平文件数据的重要组件。通过适当的配置和映射,它可以方便地读取文本文件中的数据,并将其转化为领域对象,以供进一步处理和写入。

  • 相关阅读:
    【C++】C++基础知识(八)---结构体
    C++命名空间与输入输出
    一个简单的异步爬虫
    Android之启动奔溃提示异常java.lang.SecurityException: Permission Denial: startForeground
    所有API接口分类,淘宝/天猫API、1688API、拼多多API、京东API、各大电商API接口及测试平台
    android开发中常用的Eclipse快捷键详细整理
    基于大数据的高校英语现状分析
    Openresty(二十二)ngx.balance和balance_by_lua终结篇
    基于日期、时间、经纬度下载MODIS数据并批处理
    vue-7-vuex
  • 原文地址:https://blog.csdn.net/TreeShu321/article/details/132801056