spring batch元数据


github地址:

https://github.com/a18792721831/studybatch.git

文章列表:

spring batch 入门

spring batch连接数据库

spring batch元数据

spring batch Job详解

spring batch step详解

spring batch ItemReader详解

spring batch itemProcess详解

spring batch itemWriter详解

spring batch 作业流

spring batch 健壮性

spring batch 扩展性

准备

为了更好的理解spring batch元数据,我们使用常见的数据库,将元数据存储到数据库中,然后使用SQL查询出来,就可以 快速的理解spring的元数据了。

我们新建一个spring batch的项目,gradle项目:

image-20201107150156677

然后还是我们还是用hello world的代码进行学习。

我们将代码完全拷贝过来,需要连接数据库。

image-20201107150524896

接着在resource目录下创建application.yaml文件。

在application.yaml中配置数据库以及spring batch

image-20201107150553541

spring:
  main:
    allow-bean-definition-overriding: true
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://10.0.228.117:13306/springbatch?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
    username: springbatch
    password: springbatch
    schema: classpath:org/springframework/batch/core/schema-mysql.sql
    initialization-mode: never
  batch:
    initialize-schema: never
    job:
      enabled: true
      names: study3

Job

批处理作业Job由一组Step组成,同时是作业配置的顶层配置。

每个作业有自己的名字、可以定义Step执行的顺序,以及定义作业是否可以重启。

image-20201105191052031

Job执行的时候会生成一个Job Instance,Job Instance 包含执行Job期间产生的数据已经Job执行的状态信息等;Job Instance通过Job Name和Job Parameter来区分;每次Job执行的时候都有一个Job Execution,Job Execution负责具体job的执行。

Job:作业

Job Instance:作业实例

Job Parameter:作业参数

Job Execution:作业执行器

image-20201105191415181

Job Instance

Job Instance(作业实例)是一个运行期的感念,Job每执行一次都会涉及一个Job Instance。

Job Instance来源可能有两种:一种是根据设置的Job Parameters从Job Repository(作业仓库)中获取一个;如果根据Job Parameters从Job Repository没有获取Job Instance,则重新创建一个新的Job Instance。

Job Instance定义

image-20201107155515911

字段说明

image-20201107172946603

我们修改job的名字为job-instance,然后启动一次。

image-20201107155648252

然后在mysql数据库中查询

image-20201107155903089

如果,我们将job的参数去掉,重复执行,version会增加吗?

第一次:

image-20201107160046751

第二次:

image-20201107160129781

image-20201107160137160

并不会增加。

Job Parameters

Job 通过Job Parameters来区分不同的Job Instance。简单说,就是Job Name + Job Parameters来唯一地确定一个Job Instance。如果Job Name一样,则Job Parameters肯定不一样;但是对于不同的Job来说,允许有相同的Job Parameters。

image-20201107161054325

Job Parameters定义

image-20201107161139610

字段说明

image-20201107173010064

image-20201107173019852

查看下Job Parameters表

image-20201107161221151

现在,有一个问题:Job Instance和Job Parameters的关系?

在Job Instance中有这样一个字段:JOB_KEY。

这个key就是替代了Job Parameter。

用一个比较容易理解的方式来说明Job和Job Parameters的关系。

首先从运行入手:

我们在启动一个Job的时候,需要传入Job和JobParameters:

image-20201107161842709

image-20201107161933731

第一步,根据我们传入的Job和JobParameter从数据库中查询执行结果。

我们重点看如何查询。

在查询执行结果的时候,需要查询JobInstance

image-20201107162114549

jobExecutionDao的getJobInstance方法有两个实现

image-20201107162212423

通过查看源码,猜测,JdbcJobInstanceDao是外部的,非切入式的数据库使用的dao

而MapJobInsttanceDao是切入式的数据库使用的dao。(猜测,不一定准确)

所以,我们查看JdbcJobInstanceDao的方法

image-20201107162351699

我们看下如何生成的jobKey

第一步获取JobParameter的map化对象

image-20201107162541168

第二步,将第一步获取的字符串进行MD5编码,如果MD5编码失败了,那么去UTF-8格式的前32位。(16进制)

image-20201107162611361

拿到了jobKey,如何查询JobInstance呢?

image-20201107162737642

我们看下SQL

image-20201107162806159

合并起来,简单修饰下:

image-20201107162917924

所以,Job Instance和Job Parameter的关系,在JobInstance表中存储,jobKey字段间接关联了JobParameter。

Job Parameters类型

Job Parameter只支持字符串,时间,长整型和双精度类型。

image-20201107164156433

Job Execution

我们前面看到了,执行一个Job,会根据Job Name + Job Parameter查询Job Instance。

Job Execution定义

image-20201107163423875

字段说明

image-20201107173040796

image-20201107173051712

image-20201107164341946

image-20201107163528775

在Job Execution中记录了Job Instance执行的情况,执行结果,退出信息等。

然后根据JobInstance查询Job Execution

image-20201107163158867

Job Execution的查询也是非常的简单

image-20201107163250212

这就是SQL

image-20201107163322898

如果Job Instance的最后一次执行成功了,那么抛出异常;如果最后一次执行失败了,那么验证是否有正在运行的,当前Job Instance的任务,或者是,最后一次还未结束。

image-20201107163937126

如果没有找到最后一个Job Execution,那么就验证Job Parameter的类型等是否符合规则。如果验证通过,那么就创建Job Execution

image-20201107164314028

Step

Step表示作业中的一个完整步骤,一个Job可以由一个或者多个Step组成。Step包含一个世纪运行的批处理任务中的所有必须的信息,Step可以是非常简单的业务实现,比如打印字符串;也可以是非常复杂的业务处理。

一个Job可以拥有一到多个Step;一个Step可以有一到多个Step Execution(当一个Step执行失败,下次重新执行该任务的时候,会为该Step重新生成一个Step Execution);一个Job Execution可以有一到多个Step Execution(当一个Job由多个Step组成时,每个Step执行都会生成一个新的Step Execution,则一个Job Execution会拥有多个Step Execution)。

Step中可以配置tasklet,partition,job,flow。

image-20201107165922395

Step Execution

Step Execution是Step执行的句柄,一次Step执行可能成功,也可能失败。

Step Execution定义

image-20201107170202420

字段说明

image-20201107170223899

image-20201107170232520

具体的记录

image-20201107170319843

Execution Context

Execution Context是spring batch框架提供的持久化与控制的key/value对,能够让开发者在Step Execution或Job Execution中保存需要进行持久化的状态。框架会每次commit后记录当前提交记录数以及读取的记录数,这样当Step发生错误时,下次重启Job会根据Execution Context中的数据恢复状态,保证继续从上次 失败的点重新执行。

Job Execution Context

Job Execution Context定义

image-20201107170726812

image-20201107170805715

Step Execution Context

Step Execution Context定义

image-20201107170849777

image-20201107170923472

关系

两类上下文之间的关系:一个Job Execution对应一个Job Execution的上下文;每个Step Execution对应一个Step Execution上下文;同一个Job中的Step Execution共用Job Execution的上下文。因此如果同一个Job的不同Step间需要共享数据时,则可以通过Job Execution的上下文共享数据。

Job Repository

spring batch框架提供Job Repository来存储Job执行期的元数据(这里的元数据是指Job Instance,Job Execution,Job Parameters,Step Execution,Execution Context等数据),并提供两种默认实现。一种是存放在内存中,另一种是将元数据存放在数据库中。将元数据存放在数据库中,可以随时地监控批处理Job的执行状态,查看Job执行结果是成功还是失败,并且在Job失败的情况下重新启动Job.

spring batch框架的Job Repostory支持如下的数据库:DB2,Derby,H2,HSQLDB,Mysql,Oracle,PostgreSQL,SQLServer,Sybase.

Job Repository的属性

image-20201107172020643

Job Repository类型

前面我们说过,Job Repository有两种实现方式,一种是基于数据库的,一种是基于内存的。

使用数据库:

image-20201107172408040

使用内存:

image-20201107172602725

元数据表

spring batch框架进行元数据管理共有九张表,其中有三张表(后缀为SEQ)是用来分配主键的。

image-20201107172832547

image-20201107172847856

image-20201107172857804

er关系:

image-20201107172915306

Job Launcher

Job Launcher(作业调度器)是spring batch框架基础设施层提供的运行job的能力。通过给定的job名称和作业参数Job Parameters,可以通过Job Launcher执行Job。通过Job Launcher可以在Java 程序中调用批处理任务,也可以在通过命令行或者其他框架(xxl-job或者quartz等)。spring batch框架提供了Job Launcher的简单实现SimpleJobLauncher。

ItemReader

ItemReader是Step中对资源的读处理,spring batch框架已经提供了多种类型的读实现,包括对文本文件,xml文件,数据库,jms消息等读的处理。直接使用spring batch框架提供的读组件可以快速地完成批处理应用的开发和搭建。

image-20201107173657074

ItemProcessor

ItemProcessor阶段表示 对读取的数据进行处理,开发者可以实现自己的业务操作对数据进行处理。

image-20201107173802306

process方法中,参数item是ItemReader读取的数据,返回值是交给ItemProcessor交给ItemWriter写的数据,在process方法中可以修改到的数据的值。如果返回值是null,表示忽略这次的数据。

ItemWriter

ItemWriter是Step中对资源的写处理,spring batch框架已经提供了多种类型的写实现,包括对文本文件,xml文件,DB等写的处理。直接使用spring batch框架提供的写组件可以快速地完成用用的开发和搭建。

image-20201107174134021

猜你喜欢

转载自blog.csdn.net/a18792721831/article/details/109550018