Skip to content

Spring Batch 作业配置详解

🎯 概述

在 Spring Batch 中,作业(Job)是批处理任务的核心单元。本教程将详细讲解如何配置和管理 Spring Batch 作业,重点涵盖作业重启性、执行拦截、继承机制和参数验证等关键功能。

⚙️ 基础作业配置

作业配置有两种主要方式:Java 配置和 XML 配置(推荐使用 Java/Kotlin 配置)

kotlin
@Configuration
class BatchConfig {

    @Bean
    fun footballJob(jobRepository: JobRepository): Job {
        return JobBuilder("footballJob", jobRepository)
            .start(playerLoad())
            .next(gameLoad())
            .next(playerSummarization())
            .build()
    }
}
java
@Bean
public Job footballJob(JobRepository jobRepository) {
    return new JobBuilder("footballJob", jobRepository)
             .start(playerLoad())
             .next(gameLoad())
             .next(playerSummarization())
             .build();
}

关键点说明

  1. JobRepository:作业需要 JobRepository 来持久化执行状态
  2. 步骤链.start().next() 方法定义了步骤执行顺序
  3. 作业构建器:JobBuilder 提供了流畅的 API 构建作业

🔄 作业重启性(Restartability)

作业重启性控制作业实例在失败后能否重新启动

kotlin
@Bean
fun footballJob(jobRepository: JobRepository): Job {
    return JobBuilder("footballJob", jobRepository)
        .preventRestart() //  // 禁止作业重启
        .start(playerLoad())
        .next(gameLoad())
        .build()
}

重要注意事项

  • 设置 restartable = false 表示作业不支持重启
  • 尝试重启不可重启的作业会抛出 JobRestartException
  • 默认情况下作业是可重启的(restartable = true

🔊 作业执行拦截

通过监听器在作业执行前后插入自定义逻辑

监听器接口

kotlin
interface JobExecutionListener {
    fun beforeJob(jobExecution: JobExecution)
    fun afterJob(jobExecution: JobExecution)
}

配置监听器

kotlin
@Bean
fun footballJob(jobRepository: JobRepository): Job {
    return JobBuilder("footballJob", jobRepository)
        .listener(sampleListener()) //  // 添加监听器
        .start(playerLoad())
        .build()
}

@Bean
fun sampleListener(): JobExecutionListener {
    return object : JobExecutionListener {
        override fun beforeJob(jobExecution: JobExecution) {
            // 作业开始前逻辑
        }

        override fun afterJob(jobExecution: JobExecution) {
            when (jobExecution.status) {
                BatchStatus.COMPLETED -> println("✅ 作业成功完成")
                BatchStatus.FAILED -> println("❌ 作业执行失败")
                else -> println("⚠️ 作业状态异常")
            }
        }
    }
}

注解方式替代

可以使用注解简化监听器实现:

kotlin
class SampleListener {
    @BeforeJob
    fun beforeJob(jobExecution: JobExecution) {
        // 前置处理
    }

    @AfterJob
    fun afterJob(jobExecution: JobExecution) {
        // 后置处理
    }
}

🧬 作业继承

通过继承机制复用公共作业配置

kotlin
@Configuration
open class BaseJobConfig {

    @Bean
    open fun baseJob(jobRepository: JobRepository): Job {
        return JobBuilder("baseJob", jobRepository)
            .listener(commonListener()) // 公共监听器
            .build()
    }

    @Bean
    open fun commonListener(): JobExecutionListener {
        return CommonListener()
    }
}

@Configuration
class CustomJobConfig : BaseJobConfig() {

    @Bean
    fun customJob(jobRepository: JobRepository): Job {
        val baseJob = super.baseJob(jobRepository)

        return JobBuilder("customJob", jobRepository)
            .incrementer(RunIdIncrementer())
            .listener(customListener()) //  // 添加自定义监听器
            .start(step1())
            .build()
    }
}

继承优势

  1. 配置复用:共享公共配置(监听器、验证器等)
  2. 减少重复:避免相同配置在多处重复定义
  3. 统一管理:集中维护公共逻辑

🔍 作业参数验证

使用验证器确保作业参数正确性

kotlin
@Bean
fun job1(jobRepository: JobRepository): Job {
    return JobBuilder("job1", jobRepository)
        .validator(parametersValidator()) //  // 添加参数验证器
        .start(step1())
        .build()
}

@Bean
fun parametersValidator(): JobParametersValidator {
    return object : JobParametersValidator {
        override fun validate(parameters: JobParameters?) {
            // 验证必需参数
            require(parameters?.getString("inputFile") != null) {
                "❌ 必须提供 inputFile 参数"
            }

            // 验证参数格式
            val dateParam = parameters?.getDate("processDate")
            require(dateParam != null && dateParam.before(Date())) {
                "❌ processDate 必须是过去的日期"
            }
        }
    }
}

参数验证最佳实践

  1. 必填参数检查:确保必需参数存在
  2. 格式验证:验证参数类型和格式正确性
  3. 业务规则检查:根据业务需求验证参数组合
  4. 早失败原则:在作业开始前捕获参数错误

🏁 总结

功能用途关键方法/注解
基础配置定义作业结构JobBuilder(), start(), next()
重启控制管理作业重启行为preventRestart()
执行拦截添加作业生命周期钩子JobExecutionListener, @BeforeJob, @AfterJob
作业继承复用作业配置继承作业配置类
参数验证验证作业输入参数JobParametersValidator

最佳实践建议

  1. 优先选择 Kotlin/Java 配置:比 XML 更类型安全且易于维护
  2. 合理使用重启机制:对幂等性作业启用重启,非幂等性作业禁用
  3. 添加全面的参数验证:避免因参数错误导致的作业失败
  4. 使用监听器记录作业状态:便于监控和问题排查
  5. 利用继承减少重复配置:提高代码复用性和可维护性

通过掌握这些作业配置技巧,您将能够构建健壮、可维护的 Spring Batch 批处理应用!🚀