Spring Batch 批处理
Spring Batch框架工作原理
SpringBatch
框架。它包含以下主要构建块
一个 Batch
(批处理)过程由一个 Job
(作业)组成。这个实体封装了整个批处理过程。
一个 Job
(作业)可以由一个或多个 Step
(步骤)组成。在大多数情况下,一个步骤将读取数据(通过 ItemReader
),处理数据(使用 ItemProcessor
),然后写入数据(通过 ItemWriter
)。
JobLauncher
处理启动一个 Job
(作业)。
JobRepository
存储关于配置和执行的 Job
(作业)的元数据。
示例
pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency>
配置 Spring Batch Job
创建一个 BatchConfig
类,它将配置Spring Batch。类顶部的@Configuration注解表明Spring可以使用该类作为bean定义的源。
我们添加了@EnableBatchProcessing注解,它支持所有所需 SpringBatch
特性。它还提供了设置批处理作业的基本配置。
通过添加这个注解会需要很多操作。下面是 @EnableBatchProcessing
创建的概述:
-
JobRepository (bean名称 "jobRepository")
-
JobLauncher (bean名称 "jobLauncher")
-
JobRegistry (bean名称 "jobRegistry")
-
JobExplorer (bean名称 "jobExplorer")
-
PlatformTransactionManager (bean名称 "transactionManager")
-
JobBuilderFactory (bean名称"jobBuilders"),它可以方便地防止您必须将作业存储库注入到每个
Job
(作业)中 -
StepBuilderFactory (bean名称 "stepBuilders"),以方便您避免将作业存储库和事务管理器注入到每个
Step
(步骤)中
为了使 SpringBatch
使用基于Map的 JobRepository
,我们需要扩展 DefaultBatchConfigurer
。重写 setDataSource()
方法以不设置 DataSource
。这将导致自动配置使用基于Map的 JobRepository
。
import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.context.annotation.Configuration; @Configuration @EnableBatchProcessing public class BatchConfig extends DefaultBatchConfigurer { }
配置Hello World Spring Batch 作业
@Configuration public class HelloWorldJobConfig { @Bean public Job helloWorlJob(JobBuilderFactory jobBuilders, StepBuilderFactory stepBuilders) { return jobBuilders.get("helloWorldJob").start(helloWorldStep(stepBuilders)).build(); } @Bean public Step helloWorldStep(StepBuilderFactory stepBuilders) { return stepBuilders.get("helloWorldStep").<Person, String>chunk(10) .reader(reader()).processor(processor()).writer(writer()).build(); } @Bean public FlatFileItemReader<Person> reader() { return new FlatFileItemReaderBuilder<Person>().name("personItemReader") .resource(new ClassPathResource("csv/persons.csv")) .delimited().names(new String[]{"firstName", "lastName"}).targetType(Person.class).build(); } @Bean public PersonItemProcessor processor() { return new PersonItemProcessor(); } @Bean public FlatFileItemWriter<String> writer() { return new FlatFileItemWriterBuilder<String>().name("greetingItemWriter") .resource(new FileSystemResource("txt/greetings.txt")) .lineAggregator(new PassThroughLineAggregator<>()).build(); } }
处理数据
public class PersonItemProcessor implements ItemProcessor<Person, String> { private static final Logger LOGGER = LoggerFactory.getLogger(PersonItemProcessor.class); @Override public String process(Person person) throws Exception { String greeting = "Hello " + person.getFirstName() + " " + person.getLastName() + "!"; LOGGER.info("converting '{}' into '{}'", person, greeting); return greeting; } }
测试Spring Batch 示例
使用 @RunWith
和 @SpringBootTest
测试注解告诉 JUnit
使用Spring的测试支持运行,并使用SpringBoot的支持引导。
SpringBatch
附带一个 JobLauncherTestUtils
实用程序类,用于测试批处理作业。
我们首先创建一个内部 BatchTestConfig
类,将helloWorld作业添加到 JobLauncherTestUtils
bean中。然后使用此bean的 launchJob()
方法运行批处理作业。
如果执行的作业没有任何错误,则 ExitCode
的值为 COMPLETED
。
@RunWith(SpringRunner.class) @SpringBootTest(classes = {XcSpringbootApplicationTests.BatchTestConfig.class}) public class XcSpringbootApplicationTests { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; @Test public void testHelloWorldJob() throws Exception { JobExecution jobExecution = jobLauncherTestUtils.launchJob(); assertThat(jobExecution.getExitStatus().getExitCode()).isEqualTo("COMPLETED"); } @Configuration @Import({BatchConfig.class, HelloWorldJobConfig.class}) static class BatchTestConfig { @Autowired private Job helloWorlJob; @Bean JobLauncherTestUtils jobLauncherTestUtils() throws NoSuchJobException { JobLauncherTestUtils jobLauncherTestUtils = new JobLauncherTestUtils(); jobLauncherTestUtils.setJob(helloWorlJob); return jobLauncherTestUtils; } }
}
官网:https://spring.io/projects/spring-batch
参考:https://codenotfound.com/spring-batch-example.html
资料:https://www.jianshu.com/nb/39572085
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2019-07-13 Spring Cloud Eureka 服务发现 4.2
2019-07-13 Spring Cloud简介 4.1
2019-07-13 Spring Cloud 如何使用Eureka注册服务 4.2.2
2019-07-13 Spring Boot应用的打包和部署
2019-07-13 Spring Boot与ActiveMQ的集成