Appearance
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();
}
关键点说明
- JobRepository:作业需要 JobRepository 来持久化执行状态
- 步骤链:
.start()
和.next()
方法定义了步骤执行顺序 - 作业构建器: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()
}
}
继承优势
- 配置复用:共享公共配置(监听器、验证器等)
- 减少重复:避免相同配置在多处重复定义
- 统一管理:集中维护公共逻辑
🔍 作业参数验证
使用验证器确保作业参数正确性
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 必须是过去的日期"
}
}
}
}
参数验证最佳实践
- 必填参数检查:确保必需参数存在
- 格式验证:验证参数类型和格式正确性
- 业务规则检查:根据业务需求验证参数组合
- 早失败原则:在作业开始前捕获参数错误
🏁 总结
功能 | 用途 | 关键方法/注解 |
---|---|---|
基础配置 | 定义作业结构 | JobBuilder() , start() , next() |
重启控制 | 管理作业重启行为 | preventRestart() |
执行拦截 | 添加作业生命周期钩子 | JobExecutionListener , @BeforeJob , @AfterJob |
作业继承 | 复用作业配置 | 继承作业配置类 |
参数验证 | 验证作业输入参数 | JobParametersValidator |
最佳实践建议
- 优先选择 Kotlin/Java 配置:比 XML 更类型安全且易于维护
- 合理使用重启机制:对幂等性作业启用重启,非幂等性作业禁用
- 添加全面的参数验证:避免因参数错误导致的作业失败
- 使用监听器记录作业状态:便于监控和问题排查
- 利用继承减少重复配置:提高代码复用性和可维护性
通过掌握这些作业配置技巧,您将能够构建健壮、可维护的 Spring Batch 批处理应用!🚀