Spring Batch 5.0集成MongoDB咨询:JobRepository问题及代码示例需求
Spring Batch 5集成MongoDB POC问题解答
问题1:是否需要使用MySQL这类关系型数据库作为JobRepository?
不需要。Spring Batch 5及以上版本官方支持将MongoDB作为JobRepository的存储介质,无需强制依赖关系型数据库。默认配置虽基于关系型数据库,但可通过简单配置切换到MongoDB实现作业元数据的存储。
问题2:若必须使用关系型数据库,有没有不依赖关系型数据库实现JobRepository的替代方案?
你这里的表述存在逻辑矛盾——如果必须使用关系型数据库,自然无法脱离其依赖。推测你实际想问的是不想依赖关系型数据库时,JobRepository的替代方案,可行选项包括:
- 官方MongoDB实现:Spring Batch 5原生提供MongoDB的JobRepository支持,是生产环境的首选方案
- 内存型存储:适合测试场景,使用
MapJobRepositoryFactoryBean实现,重启应用后元数据会丢失,不适合生产 - 自定义实现:基于其他非关系型数据库(如Redis)自行实现
JobRepository相关接口,但需要额外开发维护成本
问题3:Spring Batch 5不依赖关系型数据库、集成MongoDB的代码示例
以下是完整的可运行示例,涵盖读取CSV文件、写入MongoDB,同时使用MongoDB作为JobRepository存储作业元数据:
1. Maven依赖配置
<dependencies> <!-- Spring Boot Batch Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency> <!-- Spring Boot MongoDB Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> </dependencies>
2. 数据实体类
对应CSV数据结构与MongoDB文档:
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "user_records") public class UserRecord { @Id private String id; private String name; private Integer age; private String email; // 无参构造(Spring Batch需要) public UserRecord() {} // 带参构造(用于CSV数据映射) public UserRecord(String name, Integer age, String email) { this.name = name; this.age = age; this.email = email; } // 省略getter、setter方法 }
3. Batch核心配置类
配置MongoDB JobRepository、CSV读取器、MongoDB写入器及作业流程:
import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.step.builder.StepBuilder; import org.springframework.batch.item.data.MongoItemWriter; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.transaction.PlatformTransactionManager; @Configuration // 禁用默认的JDBC JobRepository自动配置 @EnableBatchProcessing(dataSourceRef = "dummyDataSource", transactionManagerRef = "dummyTransactionManager") public class MongoBatchConfig { // 配置MongoDB JobRepository @Bean public JobRepository mongoJobRepository(MongoTemplate mongoTemplate) throws Exception { return new org.springframework.batch.core.repository.support.MongoJobRepositoryFactoryBean(mongoTemplate) .getObject(); } // 虚拟数据源(满足@EnableBatchProcessing的参数要求,实际不使用) @Bean public javax.sql.DataSource dummyDataSource() { return () -> null; } // 虚拟事务管理器(MongoDB JobRepository不需要事务支持) @Bean public PlatformTransactionManager dummyTransactionManager() { return transactionStatus -> {}; } // CSV文件读取器 @Bean public FlatFileItemReader<UserRecord> csvReader() { return new FlatFileItemReaderBuilder<UserRecord>() .name("userRecordCsvReader") .resource(new ClassPathResource("users.csv")) .delimited() .names("name", "age", "email") .targetType(UserRecord.class) .build(); } // MongoDB数据写入器 @Bean public MongoItemWriter<UserRecord> mongoWriter(MongoTemplate mongoTemplate) { MongoItemWriter<UserRecord> writer = new MongoItemWriter<>(); writer.setTemplate(mongoTemplate); writer.setCollection("user_records"); return writer; } // 批处理步骤配置 @Bean public Step csvToMongoStep(JobRepository jobRepository, PlatformTransactionManager transactionManager, FlatFileItemReader<UserRecord> reader, MongoItemWriter<UserRecord> writer) { return new StepBuilder("csvToMongoStep", jobRepository) .<UserRecord, UserRecord>chunk(10, transactionManager) .reader(reader) .writer(writer) .build(); } // 批处理作业配置 @Bean public Job csvToMongoJob(JobRepository jobRepository, Step csvToMongoStep) { return new JobBuilder("csvToMongoJob", jobRepository) .start(csvToMongoStep) .build(); } }
4. 应用配置文件(application.properties)
# MongoDB连接地址 spring.data.mongodb.uri=mongodb://localhost:27017/spring_batch_db # 禁用默认的JDBC元数据表初始化 spring.batch.jdbc.initialize-schema=never
5. 测试CSV文件(src/main/resources/users.csv)
Luna,28,luna@test.com Leo,32,leo@test.com Zoe,24,zoe@test.com
内容的提问来源于stack exchange,提问作者Rahat Sarawasee
相关产品推荐
相关产品推荐

