SpringBatch reader详解

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

一、ItemReader基本概念

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

java 复制代码
public interface ItemReader<T> {
    T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException;
}

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 从文本文件中读取数据

java 复制代码
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
    
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    
    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public FlatFileItemReader<Person> reader() {
        FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
        reader.setResource(new ClassPathResource("sample-data.csv"));
        reader.setLineMapper(new DefaultLineMapper<Person>() {{
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames(new String[] { "firstName", "lastName" });
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                setTargetType(Person.class);
            }});
        }});
        return reader;
    }

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1())
            .end()
            .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
            .<Person, Person>chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();
    }

    // ...
}

三、FlatFileItemReader 详解

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

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

java 复制代码
@Bean
public FlatFileItemReader<Person> reader() {
    FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("sample-data.csv"));
    reader.setLineMapper(new DefaultLineMapper<Person>() {{
        setLineTokenizer(new DelimitedLineTokenizer() {{
            setNames(new String[] { "firstName", "lastName" });
        }});
        setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
            setTargetType(Person.class);
        }});
    }});
    return reader;
}

在上面的配置中,我们创建了一个 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 中用于读取扁平文件数据的重要组件。通过适当的配置和映射,它可以方便地读取文本文件中的数据,并将其转化为领域对象,以供进一步处理和写入。

相关推荐
BillKu1 小时前
Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
java·tomcat·mybatis
全栈凯哥1 小时前
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
java·算法·leetcode·链表
chxii1 小时前
12.7Swing控件6 JList
java
全栈凯哥1 小时前
Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
java·算法·leetcode·链表
YuTaoShao1 小时前
Java八股文——集合「List篇」
java·开发语言·list
PypYCCcccCc1 小时前
支付系统架构图
java·网络·金融·系统架构
华科云商xiao徐1 小时前
Java HttpClient实现简单网络爬虫
java·爬虫
扎瓦2 小时前
ThreadLocal 线程变量
java·后端
BillKu2 小时前
Java后端检查空条件查询
java·开发语言
jackson凌2 小时前
【Java学习笔记】String类(重点)
java·笔记·学习