spring-boot-starter-batch
Spring Batch简介
Spring Batch是一个开源的、全面的、轻量级的批处理框架,通过Spring Batch可以实现强大的批处理应用程序的开发。
Spring Batch还提供记录/跟踪、事务管理、作业处理统计、作业重启以及资源管理等功能。
Spring Batch结合定时任务可以发挥更大的作用。
Spring Batch提供了ItemReader、ItemProcessor和ItemWriter来完成数据的读取、处理以及写出操作,并且可以将批处理的执行状态持久化到数据库中。
整合Spring Boot
现在有一个data.csv文件,文件中保存了4条用户数据,通过批处理框架读取data.csv,将之插入数据表中。
添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-test</artifactId> <scope>test</scope> </dependency>
数据库基本信息配置:
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/batch?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: 123456 schema: classpath:/org/springframework/batch/core/schema-mysql.sql # 项目启动时创建数据表的SQL脚本,该脚本由Spring Batch提供 batch: initialize-schema: always # 项目启动时执行建表SQL job: enabled: false # 配置后则不会自动执行,而需要用户手动触发执行
开启Spring Batch支持:
在项目启动类上添加@EnableBatchProcessing注解开启Spring Batch支持
1 2 3 | @EnableBatchProcessing // 开启Spring Batch支持 @SpringBootApplication public class XcSpringbootApplication { |
配置批处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | @Configuration public class CsvBatchJobConfig { @Autowired JobBuilderFactory jobBuilderFactory; @Autowired StepBuilderFactory stepBuilderFactory; @Autowired DataSource dataSource; /** * Spring Batch提供了一些常用的ItemReader, * 例如JdbcPagingItemReader用来读取数据库中的数据, * StaxEventItemReader用来读取XML数据, * 本案例中的FlatFileItemReader则是一个加载普通文件的ItemReader */ @Bean @StepScope FlatFileItemReader<User> itemReader() { FlatFileItemReader<User> reader = new FlatFileItemReader<>(); reader.setLinesToSkip( 1 ); //跳过一行 reader.setResource( new ClassPathResource( "data.csv" )); //配置data.csv文件的位置 reader.setLineMapper( // 通过setLineMapper方法设置每一行的数据信息 new DefaultLineMapper<User>() {{ setLineTokenizer( new DelimitedLineTokenizer() {{ setNames( "id" , "username" , "address" , "gender" ); // setNames方法配置了data.csv文件一共有4列 setDelimiter( "\t" ); // setDelimiter则是配置列与列之间的间隔符 }}); // 设置要映射的实体类属性 setFieldSetMapper( new BeanWrapperFieldSetMapper<User>() {{ setTargetType(User. class ); }}); }}); return reader; } /** * Spring Batch也提供了多个ItemWriter的实现, * 常见的如FlatFileItemWriter,表示将数据写出为一个普通文件, * StaxEventItemWriter表示将数据写出为XML。 * 另外,还有针对不同数据库提供的写出操作支持类,如MongoItemWriter、JpaItemWriter、Neo4jItemWriter以及HibernateItemWriter等, * 本案例使用的JdbcBatchItemWriter则是通过JDBC将数据写出到一个关系型数据库中。 */ @Bean JdbcBatchItemWriter jdbcBatchItemWriter() { JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); writer.setDataSource(dataSource); // JdbcBatchItemWriter主要配置数据以及数据插入SQL,注意占位符的写法是“:属性名” writer.setSql( "insert into user(id,username,address,gender) values(:id,:username,:address,:gender)" ); // 通过BeanPropertyItemSqlParameterSourceProvider实例将实体类的属性和SQL中的占位符一一映射 writer.setItemSqlParameterSourceProvider( new BeanPropertyItemSqlParameterSourceProvider<>()); return writer; } /** * 配置一个Step */ @Bean Step csvStep() { /* * Step通过stepBuilderFactory进行配置,首先通过get获取一个StepBuilder, * get方法的参数就是该Step的name * 然后调用chunk方法的参数2,表示每读取到两条数据就执行一次write操作, * 最后分别配置reader和writer。 */ return stepBuilderFactory.get( "csvStep" ) .<User, User>chunk( 2 ) .reader(itemReader()) .writer(jdbcBatchItemWriter()) .build(); } /** * 配置一个Job */ @Bean Job csvJob() { /* * 通过jobBuilderFactory构建一个Job, * get方法的参数为Job的name, * 然后配置该Job的Step即可 */ return jobBuilderFactory.get( "csvJob" ) .start(csvStep()) .build(); } } |
创建Controller:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @RestController public class BatchController { @Autowired JobLauncher jobLauncher; @Autowired Job job; @GetMapping ( "/batch" ) public void hello() { try { //JobLauncher由框架提供,Job则是刚刚配置的,通过调用JobLauncher中的run方法启动一个批处理 jobLauncher.run(job, new JobParameters()); } catch (Exception e) { e.printStackTrace(); } } } |
测试:
最后根据上文的实体类在数据库中创建一个user表,然后启动Spring Boot工程并访问接口,访问成功后,batch库中会自动创建出多个批处理相关的表,这些表用来记录批处理的执行状态,同时,data.csv中的数据也已经成功插入user表中
文章来源: Spring Boot+Vue全栈开发实战 - 13.3 批处理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-07-06 Spring MVC 国际化
2019-07-06 Spring MVC 为控制器添加通知与处理异常