• SpringBatch(1): SpringBatch入门


    前言

    SpringBatch是什么?

    第一节 SpringBatch概述

    Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使得已经使用Spring框架的开发者更容易访问和利用企业服务。
    Spring Batch 提供了大量可重复的组件,包括了日志、追踪、事务、任务作业统计、任务重启、跳过、重复、资源管理。对于大数据量和高性能的批处理任务,Spring Batch 同样提供了高级性能和特性来支持,比如分区功能、远程功能。总之,通过Spring Batch能够支持简单的、复杂的和大数据量的批处理作业。
    Spring Batch是一个批处理应用框架,不是调度框架,但需要和调度框架合作构建完成的批处理任务。它只关注处理任务的相关问题,如事务、并发、监控等,并不提供相关的调度功能。如果需要使用调度框架,在商业软件和开源软件中已经有很多的企业级的调度框架(如Quartz) 可以使用。
    框架主要有以下功能:
    Transaction management 事务管理
    Chunk based processing 基于块的处理
    Declarative I/O 声明式的输入输出
    Start/Stop/Restart 启动/停止/重启
    Retry/Skip 重试/跳过
    在这里插入图片描述

    框架一共有4个主要角色:
    JobLauncher 任务启动器,通过它来启动任务,可以看作是程序的入口。
    Job 代表一个具体的任务
    Step 代表着一个具体的步骤,一个Job可以包含多个Step。
    JobRepository 是存储数据的地方,可以看作是一个数据库的接口,在任务执行的时候需要通过它来记录任务状态等信息。

    第二节 搭建SpringBatch项目

    版本说明
    使用的springboot版本2.7.3

    1. 新建Springboot模块,不需要选择任何模块(不需要web-starter

    2. 导入依赖

            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-batchartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.batchgroupId>
                <artifactId>spring-batch-testartifactId>
            dependency>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starterartifactId>
            dependency>
             
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    1. 启动项目,可以看到启动报错,提示我们可以需要配置一个内嵌数据库(如H2,HSQL和Derby),也可以选择一个外部的数据库。
      在这里插入图片描述

    2. 根据上面的报错,我们引入依赖h2数据库,并配置数据库的信息

            <dependency>
                <groupId>com.h2databasegroupId>
                <artifactId>h2artifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    spring:
      h2:
        console:
          path: /h2
          enabled: true  #线上运行时需要设置为false,避免暴露公网
    
    • 1
    • 2
    • 3
    • 4
    • 5

    H2相关内容见:springboot基础(29):内存数据库H2

    1. 再次启动服务器,可以看到项目没有报错
      在这里插入图片描述

    第三节 入门Spring Batch

    编写入门程序,我们知道一个Job可以对于n个Step,那么下面我们编写一个demo测试

    package com.it2.springbootspringbatch01.config;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.batch.core.Job;
    import org.springframework.batch.core.Step;
    import org.springframework.batch.core.StepContribution;
    import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
    import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
    import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
    import org.springframework.batch.core.scope.context.ChunkContext;
    import org.springframework.batch.core.step.tasklet.Tasklet;
    import org.springframework.batch.repeat.RepeatStatus;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableBatchProcessing
    @Slf4j
    public class JobConfiguration {
    
        //注入任务对象工厂
        @Autowired
        private JobBuilderFactory jobBuilderFactory;
    
        //任务的执行由Step决定,注入step对象的factory
        @Autowired
        private StepBuilderFactory stepBuilderFactory;
    
        //创建Job对象
        @Bean
        public Job jobDemo(){
            return jobBuilderFactory.get("jobDemo").start(step1()).build();
        }
    
        //创建Step对象
        @Bean
        public Step step1() {
    //        return stepBuilderFactory.get("step1").tasklet();//方式一 ,使用tasklet();
    //        方式二,stepBuilderFactory.get("step1").chunk()
           return  stepBuilderFactory.get("step1").tasklet(new Tasklet() {
                @Override
                public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                    log.info("------step1 ok");
                    return RepeatStatus.FINISHED;//决定step是否结束,否则会重试
                }
            }).build();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    启动服务器主类,可以看到SpringBatch的Job任务被执行。
    在这里插入图片描述

    第四节 Spring Batch核心API

    • JobInstance
      该领域概念与Job的关系与Java实体和类的关系一样,Job定义工作流。JobInstance就是工作流的一个具体的实例。
    • JobParameters
      是一组可以贯穿整个Job的运行时配置参。不同的配置将产生不同的JobInstance,如果使用相同的JobParameters运行一个Job,那么运行时会重用之前的Job。
    • JobExecution
      该领域概念表示JobInstance的一次运行,JobInstance运行时可能会成功或者失败,每一次JobInstance的运行都会产生一个JobExecution。
    • StepExecution
      类似JobExecutionn,该领域对象表示Step的一次运行。Step是Job的一部分,因此一个StepExecution会关联一个JobExecution。
    • ExecutionContext
      从前面的JobExecution。StepExecution的属性介绍中已经提到了该领域概念。该领域概念就是一个容器,容器由Batch框架控制。
  • 相关阅读:
    Docker的安装部署
    Linux--vim
    上周热点回顾(7.10-7.16)
    aws-msk-托管kafka集群的简单使用(VPC内部访问:无验证和SASL认证)
    嵌入式实操----基于RT1170 QSPI Flash下载算法开发实践(二十六)
    Linux内核调试技术——kprobe使用与实现(一)
    Google警告黑客如何滥用日历服务作为隐蔽的C2信道
    知识表示学习(三):TransR
    2021年全国职业院校技能大赛高职组“软件测试”赛项—“阶段二竞赛任务书”
    读完 RocketMQ 源码,我学会了如何优雅的创建线程
  • 原文地址:https://blog.csdn.net/u011628753/article/details/126811501