spring batch

spring batch

创建批处理服务:

0.启动类:两个注解,SpringBootApplication,和EnableBatchProcessing,开启Batch服务,需要额外的jre包
1.创建业务类(pojo):内存中数据存储,处理的中间类
2.创建中间处理器:批处理中的常见范例是摄取数据,对其进行转换,然后将其通过管道传输到其他地方。
3.汇总批处理作业:里面基本的需要有两个工厂:jobBuilderFactory完成job作业的build; stepBuilderFactory完成步骤build;
4.作业完成时获得通知的方法:侦听类,侦听结果

各个名词介绍:

job:

作业,里面可以start添加step和flow(step组),使用split(开启线程并发执行)等item, 可以设定步骤执行顺序,完成作业的处理
start(当前步)((.next())).on(条件).to(下一步).from(这一步).on(条件).to(当前步的下一步).end结束
注解@EnableBatchProcessing是打开Batch。如果要实现多Job的情况,需要把EnableBatchProcessing注解的modular设置为true,让每个Job使用自己的ApplicationConext。
.from(哪个).on(条件).to(到):运行到from之后,相当于一个判断,满足on的条件,就执行to的内容

flow:

step组,实现step在同一个job或不同job的复用,

step:

job中的每一步操作,一般为read-process-writer三步组成,实现数据的一步读写处理;
stepBuilderFactory.get(起名字).tasklet(((stepContribution, chunkContext) -> {
(执行逻辑)…
return RepeatStatus.FINSHEN;(返回状态,此时是完成)
})).build();

read:

读数据,可以从文件中读取,也可以从数据库中读取,从文件中读取:需要指定文件位置,
直接build:get指定名字,resource指向文件,delimited分割之后指定names和fieldSetMapper(BeanWrapperFieldSetMapper<目标类>)字段设置映射器和setTargetType(目标类class)

process:

中间处理器,完成数据读写直接的处理,按照要求或指定,完成数据处理.
重载类:自定义类实现ItemProcessor<接收类,输出类>接口,重写方法process(返回值为输出类类型),里面写具体的数据处理

write:

写数据:可以写在文件中,也可以写在数据库中
写在数据库中: 方法传入参数是数据源,首先itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider),后面两部.sql写具体sql以及将数据源传入dataSource,顺序课颠倒,最后完成build;
split:在一个job中启动另外一个线程,完成一步执行处理数据,(特别场景需求)

JobExecutionDecider决策器:

一个job内部传入参数(监听配合使用)
创建一个类,实现JobExecutionDecider接口,重写方法 decide,方法里面写逻辑(决策条件),返回值为FlowExecutionStatus(return new FlowExecutionStatus(“自己指定”));

配置 spring.batch.job.enabled = false 时,即可关闭 Batch自动执行job的操作

jobRepository:

工作库::定义Job时,需要指定一个JobRepository,用来存储Job在运行过程中的状态信息,对于存储状态信息的原因为:如果Job运行失败了,Spring支持从失败的地方重新运行,而不是从头开始;

jobLauncher:

工作启动::很好理解launchuer是用来执行Job的,如果不设置,系统也会默认给Job配置默认的Launcher;

需求: 数据库一百条数据分片查询

核心:::定义了一个类实现了Partitioner接口,重写partition方法:入参是分片数,出参是每一片的执行上下文:方法里面是一个数据处理,定义了几个变量,把每一片要查询的数据存到map里
ItemReader: 定义了排序,并将map参数传递了进去,返回jdbcPagingItemReader;
process/write,普通的输出打印
StepExecutionListener:观看每一片的执行数据和线程信息
新建一个需要分片的Step: 设置了Chunk信息,Reader/Processor/Writer以及绑定上一步定义的Listener。
核心:::PartitionHandler:处理类 传入step和线程池,里面设置分片数据;
核心:::定义一个新的PartitionStep类:包装简单的step以及分片参数,分片规则
定义测试数据
组装job,Test测试

思路整理:

1.创建一个普通job
2.job中加入设置好的分区step
3.分区step:.get(设置名称).partitioner(设置原始step的name,设置参数Partition).partitionHandler(设置分区处理器)
4.partitionHandle:创建TaskExecutorPartitionHandler实例,set连接池(TaskExecutor),setStep(原始step),setGirdSize设置分片数量;
5.Partition:类实现partitioner接口,重写partition方法,入参为分片数量,返回值为map<String, ExecutionContext>,map存储参数,中间进行6.参数数据的查询处理以及存储(参数存在ExecutionContext中,在以值的形式存在map中)
7.原始step:添加reader-process-write
8.reader:reader中先从context中获得参数(@Value(“#{stepExecutionContext[‘key’]}”)每个reader自己的查询范围),构建reader返回
9.process:按需求
10.write:按需求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值