在数据驱动时代,高效可靠的批处理能力成为企业核心需求。Spring Batch作为Spring生态系统中的批处理框架,通过标准化架构和企业级特性,彻底改变了传统批处理任务的开发模式。
典型应用场景:
传统批处理痛点:
Spring Batch通过标准化架构解决了这些痛点,提供开箱即用的企业级解决方案。
四大核心组件:
@Bean
public Job reconciliationJob() {
return jobBuilderFactory.get("dailyReconciliation")
.start(downloadBankFileStep())
.next(validateDataStep())
.next(generateReportStep())
.build();
}@Bean
public Step csvProcessingStep() {
return stepBuilderFactory.get("csvProcessing")
.<User, User>chunk(500) // 每500条提交一次
.reader(csvReader())
.processor(validationProcessor())
.writer(dbWriter())
.faultTolerant() // 容错配置
.skipLimit(10)
.skip(DataIntegrityViolationException.class)
.build();
}架构流程示意图:

环境配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>领域模型:
@Data
public class User {
private String name;
private int age;
private String email;
}完整Job配置:
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Bean
public Job importUserJob() {
return jobBuilderFactory.get("importUserJob")
.start(csvProcessingStep())
.build();
}
@Bean
public Step csvProcessingStep() {
return stepBuilderFactory.get("csvProcessing")
.<User, User>chunk(100)
.reader(userReader())
.processor(userProcessor())
.writer(userWriter())
.build();
}
// 数据读取器配置
@Bean
public FlatFileItemReader<User> userReader() {
return new FlatFileItemReaderBuilder<User>()
.resource(new ClassPathResource("users.csv"))
.delimited().delimiter(",")
.names("name", "age", "email")
.targetType(User.class)
.linesToSkip(1) // 跳过标题行
.build();
}
}执行状态流转:

复杂场景需求:
架构设计:
@Bean
public Job bankReconciliationJob() {
return jobBuilderFactory.get("bankReconciliationJob")
.start(downloadStep()) // 文件下载
.next(reconStep()) // 核心对账逻辑
.next(reportStep()) // 差异报告生成
.build();
}数据匹配处理器:
public class DataMatchingProcessor implements ItemProcessor<Transaction, Transaction> {
@Override
public Transaction process(Transaction item) {
// 双数据源匹配逻辑
if (item.getBankSerialNo() == null) {
item.setStatus(ReconStatus.ONLY_IN_SYSTEM);
} else if (item.getInternalOrderNo() == null) {
item.setStatus(ReconStatus.ONLY_IN_BANK);
} else {
compareAmounts(item); // 金额比对
compareStatuses(item); // 状态比对
}
return item;
}
}1. 分区处理(千万级数据优化)
@Bean
public Step masterStep() {
return stepBuilderFactory.get("masterStep")
.partitioner("slaveStep", partitioner())
.gridSize(10) // 根据CPU核心数调整
.taskExecutor(new ThreadPoolTaskExecutor())
.build();
}分区处理示意图:

2. 容错配置
.faultTolerant()
.retryLimit(3)
.retry(ConnectException.class) // 网络异常重试
.retry(DeadlockLoserDataAccessException.class) // 死锁重试
.skipLimit(100)
.skip(DataIntegrityViolationException.class) // 数据问题跳过3. 性能监控体系
// 集成Micrometer监控
public class BatchMetricsListener extends JobExecutionListenerSupport {
private final Counter processedRecords = Counter.builder("batch.records.processed")
.description("Total processed records")
.register(Metrics.globalRegistry);
}监控看板示例:

内存溢出处理:
@Bean
@StepScope
public FlatFileItemReader<LargeRecord> largeFileReader() {
return new FlatFileItemReaderBuilder<LargeRecord>()
.saveState(false) // 禁用状态保存
.strict(false) // 允许文件格式容错
.build();
}任务重启机制:
-- 查询失败任务
SELECT * FROM BATCH_JOB_EXECUTION WHERE STATUS = 'FAILED';动态参数传递:
// 命令行参数传递
java -jar batch.jar --spring.batch.job.name=dataImportJob date=2023-10-01性能优化检查清单:
部署提议:
通过Spring Batch的标准化架构和丰富功能,企业可以构建出高效、可靠、易维护的批处理系统,轻松应对从简单数据导入到复杂金融对账等各种场景需求。