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,并配置了 LineTokenizer 和 FieldSetMapper。
  • LineTokenizer:用于指定如何拆分每行的数据。这里使用了 DelimitedLineTokenizer 来指定分隔符。
  • FieldSetMapper:将拆分的字段映射到领域对象的属性上,这里使用了 BeanWrapperFieldSetMapper。
  1. 数据映射: 在上述配置中,我们使用 DefaultLineMapper、DelimitedLineTokenizer 和 BeanWrapperFieldSetMapper 来进行数据映射。具体来说,DelimitedLineTokenizer 拆分每一行数据,BeanWrapperFieldSetMapper 将拆分的字段映射到一个领域对象 Person 中。你可以根据实际需求调整映射的方式。

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

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

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

相关推荐
AI你一生一世5 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影5 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯6 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
Flynn Liang9 小时前
AI 应用的安全红线:Spring AI 下的 Prompt 注入防护、PII 脱敏、输出审计与密钥管理
人工智能·安全·spring·数据泄露·springai·prompt注入
QCoding10 小时前
企业级Agent Evaluation实战:Agent能跑就能上线?AI Agent到底怎么测?
后端·spring
海的透彻10 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat10 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习11 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one11 小时前
算法--构造
java·数据结构·算法
SL_staff11 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈