Spring Batch 作业监听器(Job Listener)

每个作业都有生命周期。Spring Batch 允许在生命周期的不同阶段通过提供的钩子( Hook )来添加额外的逻辑。

JobExecutionListener 接口提供了两个回调方法:beforeJob()afterJob()

创建 Spring Batch 监听器有两种方式:

Spring Batch 执行上下文(Execution Context)

批处理过程在本质上是有状态的。

JobExecution 表示的是 Job 的一次尝试运行,作业的状态在 ExecutionContext (执行上下文)中维护。

每个 JobExecution 有一个对应的 ExecutionContext 。每个 JobExecution 可能对应多个 StepExecution ,而每个 StepExecution 也各有一个对应的 ExecutionContext

Spring Batch JobParameters

在 Spring Batch 中,一个 JobInstance 只能成功运行一次,它根据作业名识别性参数的哈希值来标记任务的唯一性。

启动时命令后面带上参数:foo=bar (如果通过命令行启动,直接在 jar 文件的后面跟上 key=value 结构的参数就行了,IDEA 中可以在运行配置里设置参数)。

Spring Batch + MySQL

Spring Batch 需要存储数据以记录 Job 运行的参数、步骤等信息,这里以 MySQL 为例(需要添加 mysql-connector-j 依赖)。

完整的 pom.xml 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>me.liujiajia.batch</groupId>
    <artifactId>chapter04</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.batch</groupId>
            <artifactId>spring-batch-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
Spring Batch 之 Hello World

通过 Spring Initializr 创建 Spring Batch 项目,添加如下依赖:

  • Spring Batch
  • H2 Database
  • Spring Data JDBC