手把手教你搭建第一个Spring Batch项目的步骤
一、概述
SpringBatch是一个轻量级,全面的批处理框架。
一个典型的批处理过程可能是:
- 从数据库,文件或队列中读取大量记录。
- 以某种方式处理数据。
- 以修改之后的形式写回数据
SpringBatch应用架构图:
一个Job(作业)可以由一个或多个Step(步骤)组成。在大多数情况下,一个步骤将读取数据(通过ItemReader),处理数据(使用ItemProcessor),然后写入数据(通过ItemWriter)。
JobLauncher处理启动一个Job(作业)。
最后,JobRepository存储关于配置和执行的Job(作业)的元数据。
二、实例
1、新建springboot项目
创建项目传送门
选择配置,添加依赖,GENERATE后导入到你的IDE
2、springboot项目配置
2.1在新建项目时添加依赖了,就会发现pom中引入了spring-barch的相关依赖,如新建项目时没有添加依赖,则需要手动添加。
//pom.xmlorg.springframework.boot spring-boot-starter-batch org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine org.springframework.batch spring-batch-test test org.springframework.boot spring-boot-maven-plugin
2.2为主程序的@SpringBootApplication注解添加exclude属性,可以防止SpringBoot为数据库连接自动配置DataSource
//主程序 @SpringBootApplication(exclude=DataSourceAutoConfiguration.class) publicclassSpringbatch2020829Application{ publicstaticvoidmain(String[]args){ SpringApplication.run(Springbatch2020829Application.class,args); } }
2.3新建实体model
//Person.java publicclassPerson{ privateStringfirstName; privateStringlastName; } //构造函数,get,set方法,toString()方法略
2.4配置SpringBatchJob
2.4.1新建BatchConfig类,重写父类setDataSource方法
//BatchConfig.java @Configuration @EnableBatchProcessing publicclassBatchConfigextendsDefaultBatchConfigurer{ @Override publicvoidsetDataSource(DataSourcedataSource){ } }
2.4.2新建HelloWorldJobConfig类,配置job,step
//HelloWorldJobConfig.java @Configuration publicclassHelloWorldJobConfig{ //新建Job,Spring将自动注入jobBuilders,stepBuilders两个beans @Bean publicJobhelloWorlJob(JobBuilderFactoryjobBuilders, StepBuilderFactorystepBuilders){ returnjobBuilders.get("helloWorldJob") .start(helloWorldStep(stepBuilders)).build(); } //新建Step,使用StepBuilderFactory创建 @Bean publicStephelloWorldStep(StepBuilderFactorystepBuilders){ returnstepBuilders.get("helloWorldStep") .chunk(10).reader(reader()) .processor((Function)processor()).writer(writer()).build(); } //读取数据,指定需要读取的资源 @Bean publicFlatFileItemReader reader(){ returnnewFlatFileItemReaderBuilder () .name("personItemReader") .resource(newClassPathResource("csv/persons.csv")) .delimited().names(newString[]{"firstName","lastName"}) .targetType(Person.class).build(); } //处理数据 @Bean publicPersonItemProcessorprocessor(){ returnnewPersonItemProcessor(); } //写入数据,指定写入路径文件 @Bean publicFlatFileItemWriter writer(){ returnnewFlatFileItemWriterBuilder () .name("greetingItemWriter") .resource(newFileSystemResource( "target/test-outputs/greetings.txt")) .lineAggregator(newPassThroughLineAggregator<>()).build(); } }
2.5处理数据
//PersonItemProcessor.java publicclassPersonItemProcessor implementsItemProcessor{ privatestaticfinalLoggerLOGGER= LoggerFactory.getLogger(PersonItemProcessor.class); //打印日志信息 @Override publicStringprocess(Personperson)throwsException{ Stringgreeting="Hello"+person.getFirstName()+"" +person.getLastName()+"!"; LOGGER.info("converting'{}'into'{}'",person,greeting); returngreeting; } }
2.6测试SpringBatch示例
//PersonItemProcessor.java publicclassPersonItemProcessor implementsItemProcessor{ privatestaticfinalLoggerLOGGER= LoggerFactory.getLogger(PersonItemProcessor.class); //打印日志信息 @Override publicStringprocess(Personperson)throwsException{ Stringgreeting="Hello"+person.getFirstName()+"" +person.getLastName()+"!"; LOGGER.info("converting'{}'into'{}'",person,greeting); returngreeting; } }
2.7启动项目,在target/test-outputs/greetings.txt文件中找到结果。
三、理解
JobRepository
从字面上可以理解为"任务仓库",如果把一个批处理比作一个任务的话,这个仓库存储了很多这种任务。JobRepository会将任务包括其状态等数据持久化,存储到许多数据库中。SpringBatch默认会提供一个SimpleJobRepository仓库,方便我们开启批处理。
Job
“任务”。每个批处理都是一个任务,除了任务本身之外,任务也存在成功和失败等等状态,所以可以引出两个概念JobInstance与JobExecution。job是一个接口,JobInstance是其实现,代表了“任务”本身,提供了getJobName、getInstanceId等方法供我们获取任务本身的一些属性。JobExecution代表任务的状态,如创建时间、结束时间、结束状态、抛出的异常等等。
Step
“步骤”。批处理任务肯定有非常多的步骤,如一个最基本的数据库同步,从A数据库读取数据,存入到B数据库中,这里就分为了两个步骤。在SpringBatch中,一个任务可以有很多个步骤,每个步骤大致分为三步:读、处理、写,其对应的类分别就是ItemReader,ItemProcessor,ItemWriter。
JobLauncher
“任务装置”。如火箭发射装置就是用来操作火箭发射的,这里的任务装置就是用来执行任务的。
到此这篇关于手把手教你搭建第一个SpringBatch项目的步骤的文章就介绍到这了,更多相关SpringBatch项目搭建内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。