Spring Boot 集成
本章定位:掌握 Spring Boot 与 Spring Batch 的集成——自动配置、开箱即用组件和常见生产配置。
定义与作用
Spring Boot 提供了 spring-boot-starter-batch 起步依赖,自动配置 JobRepository、JobLauncher、DataSource 等批处理基础设施,无需手动定义这些 Bean。
小崔的体感:
"添加
@EnableBatchProcessing一行注解,JobRepository、JobLauncher、JobExplorer、PlatformTransactionManager 全部自动装配。剩下就是写你的 Job 和 Step。"
核心原理
关键自动配置
| Bean | 来源 | 默认行为 |
|---|---|---|
JobRepository | DataSource 自动配置 | JdbcJobRepository 存入主数据源 |
JobLauncher | SimpleJobLauncher | 同步启动 |
JobExplorer | 基于 JobRepository | 查询历史执行记录 |
PlatformTransactionManager | DataSource 自动配置 | JDBC 事务管理器 |
JobRegistry | MapJobRegistry | 自动注册 @Bean Job |
JobOperator | SimpleJobOperator | 命令行工具集成 |
完整示例
场景一:最小化 Spring Boot 批处理应用
@SpringBootApplication
@EnableBatchProcessing
public class MinimalBatchApplication {
public static void main(String[] args) {
SpringApplication.run(MinimalBatchApplication.class, args);
}
@Bean
public Job helloWorldJob(JobRepository jobRepository, Step helloStep) {
return new JobBuilder("helloWorldJob", jobRepository)
.start(helloStep)
.build();
}
@Bean
public Step helloStep(JobRepository jobRepository,
PlatformTransactionManager tx) {
return new StepBuilder("helloStep", jobRepository)
.tasklet((contribution, chunkContext) -> {
System.out.println("Hello, Spring Batch!");
return RepeatStatus.FINISHED;
}, tx)
.build();
}
}
场景二:生产级配置
# application.properties
# Job 元数据表前缀
spring.batch.jdbc.table-prefix=BATCH_
# 禁止启动时自动运行
spring.batch.job.enabled=false
# 初始化元数据表
spring.batch.jdbc.initialize-schema=always
# 数据源
spring.datasource.url=jdbc:mysql://localhost:3306/feixiang_batch
spring.datasource.username=batch_user
spring.datasource.password=${BATCH_DB_PASSWORD}
@Configuration
public class AsyncBatchConfig {
@Bean
public JobLauncher asyncJobLauncher(JobRepository jobRepository) {
SimpleJobLauncher launcher = new SimpleJobLauncher();
launcher.setJobRepository(jobRepository);
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(4);
executor.setThreadNamePrefix("batch-launcher-");
executor.initialize();
launcher.setTaskExecutor(executor);
return launcher;
}
}
易错场景与避坑
反例一:依赖 H2 但生产环境是 MySQL
<!-- ❌ 只加了 starter-batch,没加 MySQL 驱动 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<!-- 忘记:mysql-connector-j -->
后果:生产启动失败——Spring Boot 自动尝试初始化 H2 内存表但连的是 MySQL。
反例二:spring.batch.job.enabled=true + @Scheduled
# ❌ 应用启动 + 定时任务 → Job 执行两次(启动时一次 + 定时一次)
spring.batch.job.enabled=true
面试高频考点
Q1:Spring Boot 的 @EnableBatchProcessing 自动配置了哪些 Bean?
JobRepository(JDBC)、JobLauncher(同步 SimpleJobLauncher)、JobExplorer、PlatformTransactionManager、JobRegistry、JobOperator。这些 Bean 全部基于应用中已配置的 DataSource。
Q2:如何实现 Web 异步启动?
定义第二个
JobLauncherBean(注入ThreadPoolTaskExecutor),在 Controller 中注入该异步 Launcher。同步 Launcher 仍由 Spring Boot 自动配置(用于命令行和测试),异步 Launcher 用于 Web 请求。