Batch(一)-- 简单使用及架构简介

前言

批处理

批处理工作在面对复杂的业务以及海量的数据处理时,无需人工干预,仅需定期读入批量数据,然后完成相应业务处理并进行归档操作。

批处理特点
  1. 自动执行,根据系统设定的工作步骤自动完成。
  2. 数据量大,少则百万,多则千万甚至上亿。
  3. 定时执行,如每天执行、每周或每月执行。
批处理大致流程
  1. 读数据,数据可能来自文件、数据库或消息队列等。
  2. 处理数据,处理读取的数据并形成输出结构,如银行对账系统的资金对账处理。
  3. 写数据,将输出结果写入文件、数据库或消息队列等。

SpringBatch

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

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

SpringBatch是一个批处理应用框架,不是调度框架,但需要和调度框架合作来构建完成批处理任务。它只关注批处理任务相关的问题,如事务、并发、监控、执行等,并不提供相应的调度功能。

SpringBatch批处理框架支撑的业务场景:
  1. 定期提交批处理任务
  2. 并行批处理,即并行处理任务
  3. 企业消息驱动处理
  4. 大规模的并行处理
  5. 手动或定时重启
  6. 按顺序处理依赖的任务(可扩展为工作流驱动的批处理)
  7. 部分处理,如在回滚时忽略记录
  8. 完整的批处理事物
SpringBatch批处理框架支撑的技术目标:
  1. 利用Spring编程模型,使程序员专注于业务处理,让Spring框架管理流程
  2. 明确分离批处理的执行环境和应用
  3. 将通用核心的服务以接口形式提供
  4. 提供“开箱即用”的简单的默认的核心执行接口
  5. 提供Spring框架中配置、自定义和扩展服务
  6. 所有默认实现的核心服务能够容易的被扩展与替换,不会影响基础层
  7. 提供一个简单的部署形式,使用Maven进行编译

Spring batch 架构

springbatch主要对象:
  • Job Repository:作业仓库。其负责存储作业执行过程中的状态数据及结果。
  • Job Instance:作业实例。每个作业执行时,都会生成一个实例,实例会被存放在JobRepository中,如果作业失败,下次重新执行该作业的时候,会使用同一个作业实例;对于Job和Job Instance的关系,大家可以想象为Java类定义和Java对象实例的关系。
  • Job Launcher:作业调度器。它会根据给定的JobParameters执行作业。
  • Job Parameters :作业参数。它是一组用来启动批处理任务的参数,在启动Job的时候,可以设置任何需要的作业参数,需要注意作业参数会用来标识作业实例,即不同的Job实例是通过Job参数来区分的。
  • Job Execution:作业执行器。其负责具体Job的执行,每次运行Job都会启动一个新的Job执行器。
  • Job:作业。批处理中的核心概念,是Batch操作的基础单元。,包含一个或多个Step。
  • Step:作业步。Job的一个执行环节,多个或者一个Step组装成Job,封装了批处理任务中的一个独立的连续阶段。step包含ItemReader、ItemProcessor和ItemWriter
  • Step Execution:作业步执行器。它负责具体step的执行,每次运行Step都会启动一个新的执行器。
  • Item:条目。一条数据记录。
  • Chunk:Item集合。它给定数量Item的集合,可以定义对Chunk的读操作、处理操作、写操作,提交间隔等。
  • Item Reader:条目读。其表示step读取数据,一次读取一条。
  • Item Processor:条目处理。用于表示item的业务处理。
  • Item Writer:条目写。用于表示step输出数据,一次输出一批。
  • Tasklet:Tasklet.Step中具体执行逻辑的操作,可以重复执行,可以设置具体的同步、异步操作等。
  • Execution Context:执行上下文。它是一组框架持久化与控制的key/value对,能够让开发者在Step Execution或Job Execution范畴保存需要进行持久化的状态。

在这里插入图片描述

Job
  • 一个Job有一个或多个Step组成,Step有读、处理、写三部分操作组成;
  • 每个Job拥有自己的名字,可以定义step的执行顺序;
  • 通过JobLauncher启动Job,Job执行的时候会生成一个Job Instance(作业实例),Job Instance包含执行Job期间产生的数据以及Job执行的状态信息等;Job Instance通过Job Name(作业名称)和Job Parameter(作业参数)来区分;每次Job执行的时候都有一个Job Execution(作业执行器),Job Execution负责具体job的执行。
  • 一个Job可能有一到多个Job Instance。一个Job Instance可能有一个到多个Job Execution。
public interface Job {
    String getName();

    boolean isRestartable();

    void execute(JobExecution var1);

    @Nullable
    JobParametersIncrementer getJobParametersIncrementer();

    JobParametersValidator getJobParametersValidator();
}
Job Instance

Job Instance(作业实例)是一个运行期的概念,Job每执行一次都会涉及一个Job Instance。Job Instance来源可能有两种:一种是根据设置的Job Parameters从Job Repository(作业仓库)中获取一个;如果根据Job Parameters从Job Repository没有获取Job Instance,则新创建一个新的Job Instance。

public class JobInstance extends Entity implements javax.batch.runtime.JobInstance {
    private final String jobName;

    public JobInstance(Long id, String jobName) {
        super(id);
        Assert.hasLength(jobName, "A jobName is required");
        this.jobName = jobName;
    }

    public String getJobName() {
        return this.jobName;
    }

    public String toString() {
        return super.toString() + ", Job=[" + this.jobName + "]";
    }

    public long getInstanceId() {
        return super.getId();
    }
}
Job Execution

Job Execution 表示Job执行的句柄,一次Job执行可能成功也可能失败。只有Job Execution执行成功之后,对应的Job Instance才能被完成。
Job Execution对应的数据库表是:BATCH_JOB_EXECUTION,对应的java类是:org.springframework.batch.core.JobExecution。
表结构:
在这里插入图片描述

public class JobExecution extends Entity {
    private final JobParameters jobParameters;
    private JobInstance jobInstance;
    private volatile Collection<StepExecution> stepExecutions;
    // 执行状态。BatchStatus.STARTED表示运行时,BatchStatus.FAILED表示执行失败,BatchStatus. COMPLETED表示任务成功结束
    private volatile BatchStatus status;
    // 任务开始系统时间
    private volatile Date startTime;
    // 表示JobExecution第一次持久化时的系统时间。一个任务可能还没有启动(也就没有startTime),但总是会有createTime
    private volatile Date createTime;
    // 任务结束的系统时间
    private volatile Date endTime;
    // 最近一次JobExecution被持久化的系统时间
    private volatile Date lastUpdated;
    private volatile ExitStatus exitStatus;
    // 运行过程中所有需要被持久化的用户数据
    private volatile ExecutionContext executionContext;
    // 在任务执行过程中例外的列表
    private transient volatile List<Throwable> failureExceptions;
    private final String jobConfigurationName;
Job Parameters

Job 通过Job Parameters来区分不同的Job Instance。简单的说Job Name + Job Parameters来唯一的确定一个Job Instance。

Step Execution

Step表示作业中的一个完整步骤,一个Job可以由一个或者多个Step组成。Step包含一个实际运行的批处理任务中的所有必须的信息。
在这里插入图片描述
一个Job可以拥有一到多个Step;一个Step可以有一到多个Step Execution(当一个Step执行失败,下次重新执行该任务的时候,会为该Step重新生成一个StepExecution);一个JobExecution可以有一到多个StepExecution(当一个Job由多个Step组成时,每个Step执行都会生成一个新的StepExecution,则一个JobExecution会拥有多个StepExecution)。
StepExecution对应的数据表是:BATCH_STEP_EXECUTION
StepExecution对应的Java类是 org.springframework.batch.core.StepExecution.
在这里插入图片描述

public class StepExecution extends Entity {
    private final JobExecution jobExecution;
    private final String stepName;
    // 执行状态。BatchStatus.STARTED表示运行时,BatchStatus.FAILED表示执行失败,BatchStatus.COMPLETED表示任务成功结束
    private volatile BatchStatus status;
    // 成功读取的记录数
    private volatile int readCount;
    // 成功写入的记录数
    private volatile int writeCount;
    // 执行过程的事务中成功提交次数
    private volatile int commitCount;
    // 执行过程中事务的回滚次数
    private volatile int rollbackCount;
    // 读取失败而略过的记录数
    private volatile int readSkipCount;
    // 处理失败而略过的记录数
    private volatile int processSkipCount;
    // 写入失败而略过的记录数
    private volatile int writeSkipCount;
    private volatile Date startTime;
    private volatile Date endTime;
    private volatile Date lastUpdated;
    // 在执行过程中任何需要进行持久化的用户数据。
    private volatile ExecutionContext executionContext;
    // 任务步的运行结果,包含返回给回调者的退出代码
    private volatile ExitStatus exitStatus;
    private volatile boolean terminateOnly;
    // 被ItemProcessor过滤的记录数
    private volatile int filterCount;
    private transient volatile List<Throwable> failureExceptions;
Schema创建的9张表:

在这里插入图片描述

  • BATCH_JOB_EXECUTION 作业执行器表:用于存放当前作业的执行信息,比如创建时间,执行开始时间,执行结束时间,执行的那个Job实例,执行状态等。

  • BATCH_JOB_EXECUTION_CONTEXT 作业执行上下文表:用于存放作业执行器上下文的信息。

  • BATCH_JOB_EXECUTION_PARAMS 作业参数表:用于存放每个Job执行时候的参数信息,该参数实际上是对应Job实例的。

  • BATCH_JOB_EXECUTION_SEQ 作业执行器序列表:用于给表BATCH_JOB_EXECUTION和BATCH_JOB_EXECUTION_CONTEXT提供主键

  • BATCH_JOB_INSTANCE 作业实例表:用于存放Job的实例信息
    在这里插入图片描述
    JOB_INSTANCE_ID 主键,作业实例ID编号,根据BATCH_JOB_SEQ自动生成
    VERSION 版本号
    JOB_NAME 作业名称,即在配置文件中定义的Job id字段
    JOB_KEY 作业标识,根据作业参数序列化生成的标识;需要注意通过JOB_NAME + JOB_KEY能够唯一区分一个作业实例。
    如果是同一个Job,则JOB_KEY一定不能相同,即作业参数不能相同;如果不是同一个Job,JOB_KEY则可以相同,即作业参数可以相同。

  • BATCH_JOB_SEQ 作业序列表:用于给表BATCH_JOB_INSTANCE和BATCH_JOB_EXECUTION_PARAMS提供主键

  • BATCH_STEP_EXECUTION 作业步执行器表:用于存放每个Step执行器的信息,比如作业步开始执行时间,执行完成时间,执行装态,读/写次数,跳过次数等信息。

  • BATCH_STEP_EXECUTION_CONTEXT 作业步执行上下文表:用于存放每个作业步上下文的信息。

  • BATCH_STEP_EXECUTION_SEQ 作业步序列表:用于给表BATCH_STEP_EXECUTION和BATCH_STEP_EXECUTION_CONTEXT提供主键

简单Demo

maven,配置文件不贴了;
注意一个配置:

#是否启动项目时候,自动执行job
#spring.batch.job.enabled = false

spring batch的信息配置表的sql在源码中都有。springframework\batch\core\schema-*.sql

直接上代码:
配置一个Job和一个step:

/**
 * @author yhx
 * @date 2020/5/20 11:29
 */

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job demoJob1() {
        return jobBuilderFactory.get("demoJob1").start(demoStep1()).build();
    }

    @Bean
    public Step demoStep1() {
        return stepBuilderFactory.get("demoStep1").tasklet(new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello Batch");
                return RepeatStatus.FINISHED;
            }
        }).build();
    }
}

运行结果:
在这里插入图片描述
我们看看数据库:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下一篇我们将具体介绍下batch的架构

参考:(本batch系列文章主要参考此2人,接下来不再赘述)
https://blog.csdn.net/wuzhiwei549/category_8573774.html
https://blog.csdn.net/w_x_z_/category_6560826.html
https://www.cnblogs.com/jian0110/p/10838744.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值