Spring Batch 入门示例

下面详细讲解Spring Batch入门示例的完整攻略,内容包括:

  • Spring Batch 简介
  • Spring Batch 入门示例概述
  • 示例1:批处理读取 CSV 文件并输出到控制台
  • 示例2:批处理读取数据库中的数据并写入到 XML 文件中

Spring Batch 简介

Spring Batch 是一个高效、强大、可重用的批处理框架,能够处理海量的数据量。Spring Batch 建立在 Spring 框架之上,可以轻松地集成 Spring 生态系统的其他工具和框架,如 Spring Boot、Spring Data 和 Spring Integration 等。

Spring Batch 支持以下功能:

  • 大批量处理任务
  • 失败重试机制
  • 多线程并发处理
  • 分布式处理
  • 报告和统计

Spring Batch 入门示例概述

Spring Batch 入门示例主要包括以下内容:

  • 创建 Spring Batch 项目和 Maven 依赖
  • 编写 Job、Step、Reader、Processor 和 Writer
  • 运行 Spring Batch 示例

下面,我将分别介绍示例1和示例2的具体实现。

示例1:批处理读取 CSV 文件并输出到控制台

创建 Spring Batch 项目和 Maven 依赖

首先,我们需要创建一个基于 Maven 的 Spring Batch 项目,并添加以下 Maven 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-core</artifactId>
        <version>4.3.3</version>
    </dependency>
    <dependency>
        <groupId>com.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>5.2</version>
    </dependency>
</dependencies>

编写 Job、Step、Reader、Processor 和 Writer

在 src/main/java 目录下创建 com.example.batch 包,并添加以下类:

  1. Student.java(实体类)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    private String name;

    private String gender;

    private int age;

    private String classNo;

}
  1. CsvItemReader.java(CSV 文件读取器)
@Component
public class CsvItemReader extends FlatFileItemReader<Student> {

    public CsvItemReader() {
        setLinesToSkip(1); // 跳过表头
        setResource(new ClassPathResource("students.csv")); // CSV 文件路径
        setLineMapper(new DefaultLineMapper<Student>() {{
            setLineTokenizer(new DelimitedLineTokenizer("|") {{
                setNames(new String[]{"name", "gender", "age", "classNo"}); // CSV 文件中每一列对应实体类的属性
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<Student>() {{
                setTargetType(Student.class);
            }});
        }});
    }

}
  1. StudentItemProcessor.java(数据处理器)
@Component
public class StudentItemProcessor implements ItemProcessor<Student, Student> {

    @Override
    public Student process(Student student) throws Exception {
        student.setName(student.getName().toUpperCase()); // 将姓名转换为大写
        student.setAge(student.getAge() + 1); // 年龄加1
        return student;
    }

}
  1. ConsoleItemWriter.java(输出到控制台)
@Component
public class ConsoleItemWriter implements ItemWriter<Student> {

    @Override
    public void write(List<? extends Student> students) throws Exception {
        for (Student student : students) {
            System.out.println(student);
        }
    }

}
  1. BatchConfig.java(Spring Batch 配置类)
@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private CsvItemReader csvItemReader;

    @Autowired
    private StudentItemProcessor studentItemProcessor;

    @Autowired
    private ConsoleItemWriter consoleItemWriter;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("job")
                .incrementer(new RunIdIncrementer())
                .start(step())
                .build();
    }

    @Bean
    public Step step() {
        return stepBuilderFactory.get("step")
                .<Student, Student>chunk(10)
                .reader(csvItemReader)
                .processor(studentItemProcessor)
                .writer(consoleItemWriter)
                .build();
    }

}

运行 Spring Batch 示例

在 resources 目录下添加 students.csv,文件内容如下:

name|gender|age|classNo
张三|男|20|001
李四|女|22|002
王五|男|21|003
赵六|女|19|004

运行 com.example.batch.SpringBatchExampleApplication 类的 main 方法即可运行示例1。

示例2:批处理读取数据库中的数据并写入到 XML 文件中

创建 Spring Batch 项目和 Maven 依赖

首先,我们需要创建一个基于 Maven 的 Spring Batch 项目,并添加以下 Maven 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-core</artifactId>
        <version>4.3.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-infrastructure</artifactId>
        <version>4.3.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.5</version>
    </dependency>
</dependencies>

编写 Job、Step、Reader、Processor 和 Writer

在 src/main/java 目录下创建 com.example.batch 包,并添加以下类:

  1. User.java(实体类)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private int id;

    private String name;

    private int age;

}
  1. UserItemReader.java(数据库读取器)
@Component
public class UserItemReader extends MyBatisCursorItemReader<User> {

    public UserItemReader(SqlSessionFactory sqlSessionFactory) {
        setSqlSessionFactory(sqlSessionFactory);
        setQueryId("com.example.batch.mapper.UserMapper.selectAll"); // 调用 UserMapper 接口查询所有用户
    }

}
  1. UserItemProcessor.java(数据处理器)
@Component
public class UserItemProcessor implements ItemProcessor<User, User> {

    @Override
    public User process(User user) throws Exception {
        user.setName("Hello, " + user.getName()); // 姓名添加前缀
        user.setAge(user.getAge() + 1); // 年龄加1
        return user;
    }

}
  1. XmlItemWriter.java(写入 XML 文件)
@Component
public class XmlItemWriter extends StaxEventItemWriter<User> {

    public XmlItemWriter() throws IOException {
        setRootTagName("users");
        setResource(new FileSystemResource("users.xml")); // 输出的 XML 文件路径
        setMarshaller(getMarshaller());
    }

    private Marshaller getMarshaller() throws IOException {
        XStreamMarshaller marshaller = new XStreamMarshaller();
        marshaller.setAliases(Collections.singletonMap("user", User.class));
        marshaller.afterPropertiesSet();
        return marshaller;
    }

}
  1. BatchConfig.java(Spring Batch 配置类)
@Configuration
@EnableBatchProcessing
@MapperScan(basePackages = "com.example.batch.mapper")
public class BatchConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Autowired
    private UserItemReader userItemReader;

    @Autowired
    private UserItemProcessor userItemProcessor;

    @Autowired
    private XmlItemWriter xmlItemWriter;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("job")
                .incrementer(new RunIdIncrementer())
                .start(step())
                .build();
    }

    @Bean
    public Step step() {
        return stepBuilderFactory.get("step")
                .<User, User>chunk(10)
                .reader(userItemReader)
                .processor(userItemProcessor)
                .writer(xmlItemWriter)
                .build();
    }

}

运行 Spring Batch 示例

创建数据库和表,并插入数据:

CREATE DATABASE springbatch
USE springbatch

CREATE TABLE user (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    age INT
)

INSERT INTO user VALUES
(1, '张三', 20),
(2, '李四', 22),
(3, '王五', 21),
(4, '赵六', 19)

运行 com.example.batch.SpringBatchExampleApplication 类的 main 方法即可运行示例2。

以上就是 Spring Batch 入门示例的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Batch 入门示例 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Java线程阻塞方法sleep()与wait()的全面讲解

    Java线程阻塞方法sleep()与wait()的全面讲解 简介 在Java多线程编程中,线程状态的控制是非常重要的一个部分。线程可以处于多种状态,例如就绪状态,运行状态,阻塞状态等等。本篇文章主要讲解Java线程阻塞方法sleep()与wait()的使用和区别。 sleep()方法 sleep()方法是Thread类中一个静态方法。sleep()方法的作用…

    Java 2023年5月19日
    00
  • 流式图表拒绝增删改查之kafka核心消费逻辑下篇

    首先我们需要了解一下本篇攻略讲解的是什么。 本文的主要内容是讲解如何将Kafka的核心消费逻辑结合流式图表进行可视化呈现,进而达到更好的监控和管理分布式系统的目的。 在具体讲解之前,我们需要明确几个概念: Kafka:一个高吞吐量、分布式的消息队列系统,主要用于解决大数据流的问题。 流式图表:一种可视化数据流的工具,可以通过图形化的方式展示数据流中的数据和流…

    Java 2023年5月20日
    00
  • Springboot详解线程池与多线程及阻塞队列的应用详解

    Spring Boot详解线程池与多线程及阻塞队列的应用详解 概述 在 Java 中使用线程池和多线程可以提高程序的并发处理能力,加快计算速度。Spring Boot 提供了良好的支持,本文将介绍 Spring Boot 中线程池与多线程及阻塞队列的应用,并通过示例说明。 线程池 线程池的作用 线程池可以减少线程的创建和销毁所带来的性能开销,并可以对并发执行…

    Java 2023年5月19日
    00
  • jsp网页登陆验证

    下面是 JSP 网页登陆验证的完整攻略: 1. 概述 在 JSP 开发中,经常需要进行用户登录验证。其中,登陆验证的基本过程为:用户将自己的用户名和密码输入到登录页面上,点击登录按钮后,通过将用户输入的账号和密码与数据库中存储的用户信息进行比对,来验证用户身份是否合法。在本文中,我们将从前端页面设计、后端数据库连接、用户验证等多个方面进行讲解,帮助大家更好地…

    Java 2023年6月15日
    00
  • 浅谈Java springboot日志管理

    浅谈Java Spring Boot日志管理 作为 Java 程序员,我们使用日志来记录程序运行过程中的状态信息和错误信息。Spring Boot 提供了使用很方便的日志处理方式。在本文中,我们将介绍如何在 Spring Boot 项目中管理日志。 添加日志依赖 Spring Boot 自带日志框架,常用的是 logback 和 log4j2。如果你想使用其…

    Java 2023年5月19日
    00
  • 解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码问题

    解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码问题的攻略如下: 问题一:解决idea中Terminal终端无法执行GIT命令 问题描述 在IDEA中使用Terminal终端时,执行git命令时出现如下错误提示: -bash: git: command not found 导致无法正常使用git命令。 解决方法 经过排查发现,…

    Java 2023年5月20日
    00
  • 详述 tomcat 中的 server.xml 配置文件示例

    让我来详细讲解“详述 tomcat 中的 server.xml 配置文件示例”的完整攻略。 什么是 Tomcat 的 server.xml 配置文件 在 Tomcat 的安装目录下,有个叫做 conf 的目录,这里面有个叫做 server.xml 的文件,就是 Tomcat 的主要配置文件之一,用于配置一些全局的设置,如 Tomcat 的连接器、虚拟主机和安…

    Java 2023年5月19日
    00
  • Java日常练习题,每天进步一点点(40)

    下面是Java日常练习题的完整攻略: 1. 确定目标 我们的目标是通过做Java练习题来提高自己的编程能力,每天进步一点点。 2. 获取练习题 可以通过互联网上的Java编程练习网站,如Java编程练习网站等获取练习题。 3. 分析题目 在开始解题之前,请认真阅读题目并分析,确定题目的输入、输出、边界条件和算法思路。 4. 用Java代码实现 在分析完题目后…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部