SpringBatch的详细学习笔记
Posted I know i am free
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBatch的详细学习笔记相关的知识,希望对你有一定的参考价值。
文章目录
Gittee地址
SpringBatch的学习笔记
第一章 SpringBatch入门
第一节 SpringBatch概述
Spring Batch是个轻量级的、 完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使得已经使用Spring框架的开发者或者企业更容易访问和利用企业服务。
Spring Batch提供了大量可重用的组件,包括了日志追踪、事务、任务作业统计、任务重启、跳过、重复资源管理。对于大数据量和高性能的批处理任
务,Spring Batch同样提供了高级功能和特性来支持比如分区功能、远程功能。总之,通过Spring Batch能够支持简单的、复杂的和大数据量的批处理作业。
Spring Batch是一个批处理应用框架,不是调度框架,但需要和调度框架(比如美团的:xxl-job)合作来构建完成的批处理任务。它只关注批处理任务相关的问题,如事务、并发、监控、执行等,并不提供相应的调度功能。如果需要使用调用框架,在商业软件和开源软件中已经有很多优秀的企业级调度框架(如Quartz. Tivoli、 Control-M、 Cron等)可以使用。
框架主要有以下功能:
Transaction management (事务管理)
Chunk based processing (基于块的处理)
Declarative 1/0 (声明式的输入输出)
Start/Stop/Restart (启动/停止/再启动)
Retry/Skip (重试/跳过)
框架一共有4个主要角色:
JobLauncher是任务启动器,通过它来启动任务,可以看做是程序的入口。
Job代表着一个具体的任务。
Step代表着一个具体的步骤,一个Job可以包含多个Step (想象把大象放进冰箱这个任务需要多少个步骤你就明白了) .
JobRepository是存储数据的地方,可以看做是一个数据库的接口,在任务执行的时候需要通过它来记录任务状态等等信息。
第二节 搭建SpringBatch项目
网站,idea。。
第三节 SpringBatch入门程序
@Configuration
@EnableBatchProcessing
public class JobConfiguration
/**
* @Description: 注入创建任务对象的对象
* @Param:
* @Return:
*/
@Autowired
private JobBuilderFactory jobBuilderFactory;
/**
* @Description: //任务的执行由Step决定,注入创建Step对象的对象
* @Param:
* @Return:
*/
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
/**
* @Description: 创建任务对象
* @Param: []
* @Return: org.springframework.batch.core.Job
*/
public Job helloWorldJob()
//job名字//开始step
return jobBuilderFactory.get("helloWorldJob")
.start(step1())
.build();
@Bean
public Step step1()
/**
* @Description: step1 step的名字,tasklet执行任务 可以用chunk
* @Param: []
* @Return: org.springframework.batch.core.Step
*/
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet()
@Override
/**
* @Description: RepeatStatus 状态值,一步步来,一个step结束开始下一个
* @Param: [stepContribution, chunkContext]
* @Return: org.springframework.batch.repeat.RepeatStatus
*/
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception
System.out.println("He11o World!");
return RepeatStatus.FINISHED;
).build();
第四节 替换为mysql数据库
<dependency>
<groupId>mysq1</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>ore.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
application.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/batch
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
spring.batch.initialize-schema=always
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
第五节 核心API
, sheode tate = 207085
JooPrsates
JolEauutin
**JobInstance:**该领域概念和ob的关系’jJava中实何和类的关系样,Job定义了个工.作流程。JobInstance就是该 工作流程的一个具体实例。一个Job可以有多 个JobInstance
JobParameters:是组可以贯穿整Job的运行时配置参数。不同的配置将产生不同的JobInstance. 如果你是使用JobParameters运行间Job. 那么这次运行会重用 上
JobExecution: 该领域概念 表示JobInstance的运行。 JobInstance运行时可能会成功或者失败。每次jobInstance的运行都会产生 1个JobExecution. 运行时间,开始结束,状态,成功与否。。
**StepExecution:**类似于 JobExecution.该领域对象表示Step的运行。Step足Job的部分。 因此个StepExecution公关联到 个Jobexecution. 另外。浅对象还会存储很
**ExecutionContext:**上下文,从前面的JobExecution. StepExecution的属性介绍中已经提到I该领域概念。说穿了。该领域概念就是个容器。该容器Batch框架控制。框架对该容器持久化。
第二章 作业流
第一节 Job的创建和使用
Job:作业。批处理中的核心概念,是Batch操作的基础单元。
每个作业Job有1个或者多个作业步Step:
@Configuration
@EnableBatchProcessing
public class JobDemo
/**
* @Description: 注入创建任务对象的对象
* @Param:
* @Return:
*/
@Autowired
private JobBuilderFactory jobBuilderFactory;
/**
* @Description: //任务的执行由Step决定,注入创建Step对象的对象
* @Param:
* @Return:
*/
@Autowired
private StepBuilderFactory stepBuilderFactory;
/**
* @Description: 让step1,step2,step3依次执行
* @Param: []
* @Return: org.springframework.batch.core.Job
*/
@Bean
public Job jobDemoJob()
return jobBuilderFactory.get("jobDemoJob")
.start(step1())
.on("COMPLETED").to(step1())
.from(step2()).on("COMPLETED").to(step3())
.from(step3()).end()
.build();
// .from(step2()).on("COMPLETED").fail()
// .from(step2()).on("COMPLETED").stopAndRe
// .start(step1())
// .next(step2())
// .next(step3())
// .build();
public Step step3()
return stepBuilderFactory.get("step3")
.tasklet(new Tasklet()
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception
System.out.println("step3");
return RepeatStatus.FINISHED;
).build();
public Step step2()
return stepBuilderFactory.get("step2")
.tasklet(new Tasklet()
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception
System.out.println("step2");
return RepeatStatus.FINISHED;
).build();
public Step step1()
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet()
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception
System.out.println("step1");
return RepeatStatus.FINISHED;
).build();
第二节 Flow的创建和使用
1.Flow是多个Step的集合
2.可以被多个Job复用
3.使用FlowBuilder来创建
@Configuration
@EnableBatchProcessing
public class FlowDemo
/**
* @Description: 注入创建任务对象的对象
* @Param:
* @Return:
*/
@Autowired
private JobBuilderFactory jobBuilderFactory;
/**
* @Description: //任务的执行由Step决定,注入创建Step对象的对象
* @Param:
* @Return:
*/
@Autowired
private StepBuilderFactory stepBuilderFactory;
/**
* @Description: 创建Flow对象,指明F1ow对象包含哪些step
* @Param: []
* @Return: org.springframework.batch.core.job.flow.Flow
*/
@Bean
public Flow flowDemoFlow()
return new FlowBuilder<Flow>("flowDemoFlow")
.start(flowDemoStep1())
.next(flowDemoStep2())
.build();
/**
* @Description: fowDemoJob
* @Param: []
* @Return: org.springframework.batch.core.Job
*/
@Bean
public Job fowDemoJob()
return jobBuilderFactory.get("fowDemoJob0")
.start(flowDemoFlow())
.next(flowDemoStep3())
.end()
.build();
... ...
第三节 split实现并发执行
实现任务中的多个step或多个flow并发执行
1:创建若干个step
2:创建两个flow
3:创建-个任务包含以上两个flow,井让这两个flow并发执行
@Configuration
@EnableBatchProcessing
public class SplitDemo
/**
* @Description: 注入创建任务对象的对象
* @Param:
* @Return:
*/
@Autowired
private JobBuilderFactory jobBuilderFactory;
/**
* @Description: //任务的执行由Step决定,注入创建Step对象的对象
* @Param:
* @Return:
*/
@Autowired
private StepBuilderFactory stepBuilderFactory;
/**
* @Description: 创建Flow对象,指明F1ow对象包含哪些step
* @Param: []
* @Return: org.springframework.batch.core.job.flow.Flow
*/
@Bean
public Flow splitDemoFlow1()
return new FlowBuilder<Flow>("splitDemoFlow1")
.start(splitDemoStep1())
.build();
@Bean
public Flow splitDemoFlow2()
return new FlowBuilder<Flow>("splitDemoFlow2")
.start(splitDemoStep2())
.next(splitDemoStep3())
.build();
/**
* @Description: fowDemoJob
* @Param: []
* @Return: org.springframework.batch.core.Job
*/
@Bean
public Job splitDemoJob()
return jobBuilderFactory.get("splitDemoJob")
.start(splitDemoFlow1())
.split(new SimpleAsyncTaskExecutor())
.add(splitDemoFlow2())
.end()
.build();
第四节 决策器的使用
接口: JobExecutionDecider
public class MyDecider implements JobExecutionDecider
private int count;
/**
* @Description: decide 决策器,先执行odd奇数
* @Param: [jobExecution, stepExecution]
* @Return: org.springframework.batch.core.job.flow.FlowExecutionStatus
*/
@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution)
count++;
if(count%2==0)
return new FlowExecutionStatus("even偶数");
else
return new FlowExecutionStatus("odd奇数");
@Configuration
@EnableBatchProcessing
public class DeciderDemo
/**
* @Description: 注入创建任务对象的对象
* @Param:
* @Return:
*/
@Autowired
private JobBuilderFactory jobBuilderFactory;
/**
* @Description: //任务的执行由Step决定,注入创建Step对象的对象
* @Param:
* @Return:
*/
@Autowired
private StepBuilderFactory stepBuilderFactory;
/**
* @Description: myDecider 决策器
* @Param: []
* @Return: org.springframework.batch.core.job.flow.JobExecutionDecider
*/
@Bean
public JobExecutionDecider myDecider()
return new MyDecider();
@Bean
public Job deciderDemoJob()
return jobBuilderFactory.get("deciderDemoJob")
.start(deciderDemoStep1())
.next(myDecider())
.from(myDecider()).on("even偶数").to(deciderDemoStep2())
.from(myDecider())
.on("odd奇数").to(deciderDemoStep3())
.from(deciderDemoStep3())
.on("*").to(myDecider())//无论返回什么,回到决策器 ↑next(myDecider())
.end()
.build();
@Bean
public Step deciderDemoStep1()
return stepBuilderFactory.get("deciderDemoStep1")
.tasklet(new Tasklet()
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception
System.out.println("deciderDemoStep1!");
return RepeatStatus.FINISHED;
).build();
第五节 Job的嵌套
一个Job可以嵌套在另一个Job中,被嵌赛的Job称为子Job,外部Job称为父Jb。子job不能单独执行, 賽要由父Job来启动
案例:创建两个Job,作为子Job,再创建一个Job作为父Job
@Configuration
public class NestedDemo
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobLauncher launcher;
@Autowired
private Job childJobOne;
@Autowired
private Job childJobTwo;
@Bean
public Job parentJob(JobRepository jobRepository, PlatformTransactionManager transactionManager)
return jobBuilderFactory.get("parentJobs")
.start(childJob1(jobRepository,transactionManager))
.next(childJob2(jobRepository,transactionManager))
.build();
/**
* @Description: childJob2返回Job类型的Step,特殊Step
* @Param: []
* @Return: org.springframework.batch.core.Step
*/
private Step childJob2(JobRepository jobRepository, PlatformTransactionManager transactionManager)
return new JobStepBuilder(new StepBuilder("childJob2"))
.job(childJobTwo)
.launcher(launcher)
.repository(jobRepository)
.transactionManager(transactionManager)
.build();
private Step childJob1(JobRepository jobRepository,PlatformTransactionManager transactionManager)
return new JobStepBuilder(new StepBuilder("childJob1"))
.job(childJobOne)
.launcher(launcher)
.repository(jobRepository)
.transactionManager(transactionManager)
.build();
@Configuration
@EnableBatchProcessing
public class ChildJob2
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Step childJob2Step1()
return stepBuilderFactory.get("childJob2Step1")
.tasklet(new Tasklet()
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception
System.out.println("childJob2Step1!");
return RepeatStatus.FINISHED;
).build();
@Bean
public Step childJob2Step2()
return stepBuilderFactory.get("childJob2Step2")
.tasklet(new Tasklet()
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception
以上是关于SpringBatch的详细学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
ROS学习笔记之——基于dv-gui的多种事件相机标定的方法对比