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