• 【Spring】SpringBatch快速入门


    SpringBatch概述

      文档:https://docs.spring.io/spring-batch/docs/current/reference/html/index.html

    ​   Spring Batch是个轻量级的、 完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使得已经使用Spring框架的开发者或者企业更容易访问和利用企业服务。

      Spring Batch提供了大量可重用的组件,包括了日志追踪、事务、任务作业统计、任务重启、跳过、重复资源管理。对于大数据量和高性能的批处理任 务,Spring Batch同样提供了高级功能和特性来支持比如分区功能、远程功能。总之,通过Spring Batch能够支持简单的、复杂的和大数据量的批处理作业。

      Spring Batch是一个批处理应用框架,不是调度框架,但需要和调度框架合作来构建完成的批处理任务。它只关注批处理任务相关的问题,如事务、并发、监控、执行等,并不提供相应的调度功能。如果需要使用调用框架,在商业软件和开源软件中已经有很多优秀的企业级调度框架(如Quartz. Tivoli、 Control-M、 Cron等)可以使用。

      框架主要有以下功能: Transaction management (事务管理) Chunk based processing (基于块的处理) Declarative 1/0 (声明式的输入输出) Start/Stop/Restart (启动/停止/再启动) Retry/Skip (重试/跳过)

       

       框架一共有4个主要角色:

      JobLauncher是任务启动器,通过它来启动任务,可以看做是程序的入口。

      Job代表着一个具体的任务。

      Step代表着一个具体的步骤,一个Job可以包含多个Step (想象把大象放进冰箱这个任务需要多少个步骤你就明白了) .

      JobRepository是存储数据的地方,可以看做是一个数据库的接口,在任务执行的时候需要通过它来记录任务状态等等信息。

    SpringBatch入门程序

      1、创建一个SpringBoot项目,SpringBatch依赖,如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <modelVersion>4.0.0</modelVersion>
     6 
     7     <groupId>com.test</groupId>
     8     <artifactId>test-springboot-batch</artifactId>
     9     <version>1.0-SNAPSHOT</version>
    10 
    11     <parent>
    12         <groupId>org.springframework.boot</groupId>
    13         <artifactId>spring-boot-starter-parent</artifactId>
    14         <version>2.2.5.RELEASE</version>
    15         <relativePath/> <!-- lookup parent from repository -->
    16     </parent>
    17 
    18     <properties>
    19         <maven.compiler.source>8</maven.compiler.source>
    20         <maven.compiler.target>8</maven.compiler.target>
    21     </properties>
    22 
    23     <dependencies>
    24         <dependency>
    25             <groupId>org.springframework.boot</groupId>
    26             <artifactId>spring-boot-starter-web</artifactId>
    27         </dependency>
    28 
    29         <dependency>
    30             <groupId>org.springframework.boot</groupId>
    31             <artifactId>spring-boot-starter-batch</artifactId>
    32         </dependency>
    33 
    34         <!-- mysql -->
    35         <dependency>
    36             <groupId>mysql</groupId>
    37             <artifactId>mysql-connector-java</artifactId>
    38             <version>8.0.12</version>
    39         </dependency>
    40     </dependencies>
    41 
    42     <build>
    43         <plugins>
    44             <plugin>
    45                 <groupId>org.springframework.boot</groupId>
    46                 <artifactId>spring-boot-maven-plugin</artifactId>
    47             </plugin>
    48         </plugins>
    49     </build>
    50 
    51 </project>
    View Code 

       2、编辑配置文件,这里要使用mysql数据库,任务信息持久化到数据库中

    1 spring:
    2   datasource:
    3     username: root
    4     password: 123456
    5     url: jdbc:mysql://127.0.0.1:3306/test_springbatch?allowPublicKeyRetrieval=true&useSSL=true
    6     driver-class-name: com.mysql.cj.jdbc.Driver
    7     # 初始化数据库,文件在依赖jar包中
    8     schema: classpath:org/springframework/batch/core/schema-mysql.sql
    9     initialization-mode: always 

       3、编辑主启动类

    1 @SpringBootApplication
    2 public class Application {
    3 
    4     public static void main(String[] args) {
    5 
    6         SpringApplication.run(Application.class);
    7     }
    8 }

      4、配置Job

     1 package com.test.config;
     2 
     3 import org.springframework.batch.core.Job;
     4 import org.springframework.batch.core.Step;
     5 import org.springframework.batch.core.StepContribution;
     6 import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
     7 import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
     8 import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
     9 import org.springframework.batch.core.scope.context.ChunkContext;
    10 import org.springframework.batch.core.step.tasklet.Tasklet;
    11 import org.springframework.batch.repeat.RepeatStatus;
    12 import org.springframework.beans.factory.annotation.Autowired;
    13 import org.springframework.context.annotation.Bean;
    14 import org.springframework.context.annotation.Configuration;
    15 
    16 /**
    17  * @author H__D
    18  * @description 
    19  * @date 2021/10/30
    20  */
    21 @Configuration
    22 // 启用批处理功能
    23 @EnableBatchProcessing
    24 public class JobConfiguration {
    25 
    26     // 注入创建任务的对象
    27     @Autowired
    28     private JobBuilderFactory jobBuilderFactory;
    29 
    30     // 注入创建步骤的对象
    31     @Autowired
    32     private StepBuilderFactory stepBuilderFactory;
    33 
    34     @Bean
    35     public Job helloworldJob() {
    36         return jobBuilderFactory.get("helloworldJob")
    37                 .start(step1())
    38                 .build();
    39     }
    40 
    41     @Bean
    42     public Step step1() {
    43         return stepBuilderFactory.get("step1")
    44                 .tasklet(new Tasklet() {
    45                     @Override
    46                     public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
    47                         System.out.println(Thread.currentThread().getName() + "------" + "hello world");
    48                         // 返回执行完成状态
    49                         return RepeatStatus.FINISHED;
    50                     }
    51                 }).build();
    52     }
    53 }

      5、运行启动类

      查看结果

       mysql数据库

    核心API

      参考:https://docs.spring.io/spring-batch/docs/current/reference/html/domain.html#domainLanguageOfBatch

      Job

      描述与批处理作业概念相关的构造型。AJob是封装了整个批处理过程的实体。与其他 Spring 项目一样,aJob与 XML 配置文件或基于 Java 的配置连接在一起。这种配置可以被称为“作业配置”。但是, Job它只是整个层次结构的顶部,如下图所示: 

      

      JobInstance

      JobInstance指的是逻辑作业运行的概念。考虑应该在一天结束时运行一次的批处理作业,例如Job上图中的“EndOfDay” 有一个“EndOfDay”作业,但Job必须单独跟踪每个单独的运行在这项工作的情况下,JobInstance每天有一个合乎逻辑的

      JobParameters

      一个JobParameters对象包含一组用于启动批处理作业的参数。它们可用于识别甚至在运行期间作为参考数据,如下图所示:

      

      JobExecution

       JobExecution指的是单次尝试运行作业的技术概念。执行可能以失败或成功结束,但JobInstance除非执行成功完成,否则对应于给定执行的不被视为完成。

       Job定义了作业是什么以及如何执行它,并且 a JobInstance是一个纯粹的组织对象,用于将执行组合在一起,主要是为了启用正确的重启语义。

      Step 

      A Step是一个域对象,它封装了批处理作业的一个独立的、连续的阶段。因此,每个 Job 完全由一个或多个步骤组成。AStep包含定义和控制实际批处理所需的所有信息。这是一个必然模糊的描述,因为任何给定的内容Step都由开发人员自行决定编写JobAStep可以像开发人员希望的那样简单或复杂。一个简单的Step可能将数据从文件加载到数据库中,需要很少或不需要代码(取决于使用的实现)。更复杂的 Step可能具有作为处理的一部分应用的复杂业务规则。与 a 一样Job, a Step有一个个体StepExecution与 unique 相关 JobExecution,如下图所示:

      

      StepExecution

       A StepExecution代表一次尝试执行 a StepStepExecution 每次Step运行a 时都会创建一个新的,类似于JobExecution. 但是,如果一个步骤因为它之前的步骤失败而无法执行,则不会为其持久执行。A StepExecution仅在其Step实际启动时才创建。

      Step执行由StepExecution的对象表示每个执行都包含对其相应步骤和JobExecution事务相关数据的引用,例如提交和回滚计数以及开始和结束时间。此外,每个步骤执行都包含一个ExecutionContext,其中包含开发人员需要在批处理运行中保留的任何数据,例如重新启动所需的统计信息或状态信息。

      JobRepository

      JobRepository是上述所有 Stereotypes 的持久性机制。它提供了CRUD操作JobLauncherJob以及Step实现。当 Job第一次启动,一个JobExecution被从库中获得,并且,执行的过程中,StepExecutionJobExecution实施方式是通过将它们传递到存储库持续。

      使用 Java 配置时,该@EnableBatchProcessing注解提供了一个 JobRepository作为开箱即用自动配置的组件之一

      JobLauncher

       JobLauncher表示一个简单的接口,用于Job使用给定的 集合 启动JobParameters

    1 public interface JobLauncher {
    2 
    3 public JobExecution run(Job job, JobParameters jobParameters)
    4             throws JobExecutionAlreadyRunningException, JobRestartException,
    5                    JobInstanceAlreadyCompleteException, JobParametersInvalidException;
    6 }

    参考文档:

    https://gitee.com/vahala/springbatchlearn

    https://blog.csdn.net/cxy_chh/article/details/92062259

  • 相关阅读:
    基于go语言的消息推送系统架构分析
    golang IDE 工具liteide打开报错解决方法
    centos 安装ffmpeg 并生成文件截图
    android 微信分享
    函数编程之闭包漫谈(Closure)
    2017-06-26
    本周总结
    一周总结
    一周总结
    一周总结
  • 原文地址:https://www.cnblogs.com/h--d/p/15591075.html
Copyright © 2020-2023  润新知