Spring Batch | quick start

在这里插入图片描述

导学

官网介绍:https://docs.spring.io/spring-batch/reference/spring-batch-intro.html
批处理就是将数据分批次进行处理的过程。
常规的批处理操作步骤:系统A从数据库中导出数据到文件,系统B读取文件数据并写入到数据库
批处理特点:

  • 自动执行,根据系统设定的工作步骤自动完成
  • 数据量大,少则百万,多则上千万甚至上亿。(如果是10亿,100亿那只能上大数据了)
  • 定时执行,比如:每天,每周,每月执行。
使用场景

典型的批处理程序通常:

  • 从数据库、文件或队列中读取大量记录。
  • 以某种方式处理数据。
  • 以修改后的形式写回数据。

Spring Batch 自动化了这个基本的批处理迭代,提供了将类似事务作为一个集合进行处理的能力,通常是在离线环境中,无需任何用户交互。批处理作业是大多数 IT 项目的一部分,Spring Batch 是唯一提供强大的企业级解决方案的开源框架。

业务场景

Spring Batch支持以下业务场景:

  • 定期提交批处理过程。
  • 并行批处理:对作业进行并行处理。
  • 分阶段、企业消息驱动的处理。
  • 大规模并行批处理。
  • 故障后手动或计划重新启动。
  • 相关步骤的顺序处理(扩展到工作流驱动的批处理)。
  • 部分处理:跳过记录(例如,在回滚时)。
  • 整个批处理事务,适用于具有小批量大小或现有存储过程或脚本的情况。

quick start - 内存版

需求:打印一个Hello Spring Batch!不带读、写和处理。

  1. 创建一个干净的maven项目
  2. 在pom.xml中添加以下依赖:
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- 内存版 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  1. 创建一个Spring Boot启动类:
@SpringBootApplication
// 加上@EnableBatchProcessing注解后,SpringBoot会自动加载 JobLauncher JobBuilderFactory StepBuilderFactory 类并创建对象交给容器管理,要使用时,直接注入即可
@EnableBatchProcessing
public class SpringBatchApplication {
    public static void main(String[] args) {
        org.springframework.boot.SpringApplication.run(SpringBatchApplication.class, args);
    }
}
  1. 定义一个任务:
@Configuration
public class QuickStartH2 {

    // job调度器
    @Autowired
    private JobLauncher jobLauncher;

    // job构造器工厂
    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    // step构造器工厂
    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    /**
     * 任务: step执行逻辑由tasklet实现
     * @return
     */
    @Bean
    public Tasklet tasklet() {
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello Spring Batch!");
                return RepeatStatus.FINISHED;
            }
        };
    }

    /**
     * step: 执行逻辑(作业步骤)
     * @return
     */
    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .tasklet(tasklet())
                .build();
    }

    /**
     * job: 任务
     * @return
     */
    @Bean
    public Job job() {
        return jobBuilderFactory.get("job-h2")
                .start(step1())
                .build();
    }
}

批处理允许重复执行,异常重试,此时需要保存批处理状态与数据,Spring Batch 将数据缓存在H2内存中或者缓存在指定数据库中。

  1. 启动项目:

image.png

quick start - MySQL版

  1. 创建spring_batch数据库:

image.png

  1. 将pom.xml中的h2依赖注释掉
  2. application.yml文件配置数据库连接和初始化SQL脚本

注意:
sql.init.model 第一次启动为always, 后面启动需要改为never,否则每次执行SQL都会异常。第一次启动会自动执行指定的脚本,后续不需要再初始化。

spring:
  datasource:
    username: root
    password: admin
    url: jdbc:mysql://127.0.0.1:3309/spring_batch?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
  # 初始化数据库,sql脚本在依赖jar中
  sql:
    init:
      mode: always
      schema-locations: classpath:org/springframework/batch/core/schema-mysql.sql
#      mode: never
  1. 定义一个任务:
@Configuration
public class QuickStartMySql {

    // job调度器
    @Autowired
    private JobLauncher jobLauncher;

    // job构造器工厂
    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    // step构造器工厂
    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    /**
     * 任务: step执行逻辑由tasklet实现
     * @return
     */
    @Bean
    public Tasklet tasklet() {
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello Spring Batch!");
                return RepeatStatus.FINISHED;
            }
        };
    }

    /**
     * step: 执行逻辑(作业步骤)
     * @return
     */
    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .tasklet(tasklet())
                .build();
    }

    /**
     * job: 任务
     * @return
     */
    @Bean
    public Job job() {
        return jobBuilderFactory.get("job-MySQL")
                .start(step1())
                .build();
    }
}
  1. 启动项目:

image.png

  1. 数据库:

image.png
image.png

github笔记

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值