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

相关推荐
爬山算法13 分钟前
Maven(28)如何使用Maven进行依赖解析?
java·maven
2401_8574396937 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66638 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索40 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
芒果披萨1 小时前
Filter和Listener
java·filter
qq_4924484461 小时前
Java实现App自动化(Appium Demo)
java
阿华的代码王国1 小时前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
找了一圈尾巴2 小时前
前后端交互通用排序策略
java·交互
哎呦没4 小时前
SpringBoot框架下的资产管理自动化
java·spring boot·后端
m0_571957586 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解