淮安网站建设制作,辅导班广告去哪个网站做,建设网站的功能定位是什么原因,十大应用商店app目录
引言
概念
分区器
分区处理器
案例
转视频版 引言
接着上篇#xff1a;Spring Batch 高级篇-并行步骤了解Spring Batch并行步骤后#xff0c;接下来一起学习一下Spring Batch 高级功能-分区步骤
概念
分区#xff1a;有划分#xff0c;区分意思#xff0c;在…目录
引言
概念
分区器
分区处理器
案例
转视频版 引言
接着上篇Spring Batch 高级篇-并行步骤了解Spring Batch并行步骤后接下来一起学习一下Spring Batch 高级功能-分区步骤
概念
分区有划分区分意思在SpringBatch 分区步骤讲的是给执行步骤区分上下级。
上级 主步骤(Master Step)
下级 从步骤--工作步骤(Work Step)
主步骤是领导不用干活负责管理从步骤从步骤是下属必须干活。
一个主步骤下辖管理多个从步骤。
注意 从步骤不管多小它也一个完整的Spring Batch 步骤负责各自的读入、处理、写入等。
分区步骤结构图 分区步骤一般用于海量数据的处理上其采用是分治思想。主步骤将大的数据划分多个小的数据集然后开启多个从步骤要求每个从步骤负责一个数据集。当所有从步骤处理结束整作业流程才算结束。
分区器
主步骤核心组件负责数据分区将完整的数据拆解成多个数据集然后指派给从步骤让其执行。
拆分规则由Partitioner分区器接口定制默认的实现类MultiResourcePartitioner
public interface Partitioner {MapString, ExecutionContext partition(int gridSize);
}
Partitioner 接口只有唯一的方法partition 参数gridSize表示要分区的大小可以理解为要开启多个worker步骤返回值是一个Map 其中keyworker步骤名称 valueworker步骤启动需要参数值一般包含分区元数据比如起始位置数据量等。
分区处理器
主步骤核心组件统一管理work 步骤 并给work步骤指派任务。
管理规则由PartitionHandler 接口定义默认的实现类TaskExecutorPartitionHandler
案例
需求下面几个文件将数据读入内存 步骤1准备数据
user1-10.txt
1#dafei#18
2#dafei#18
3#dafei#18
4#dafei#18
5#dafei#18
6#dafei#18
7#dafei#18
8#dafei#18
9#dafei#18
10#dafei#18
user11-20.txt
11#dafei#18
12#dafei#18
13#dafei#18
14#dafei#18
15#dafei#18
16#dafei#18
17#dafei#18
18#dafei#18
19#dafei#18
20#dafei#18
user21-30.txt
21#dafei#18
22#dafei#18
23#dafei#18
24#dafei#18
25#dafei#18
26#dafei#18
27#dafei#18
28#dafei#18
29#dafei#18
30#dafei#18
user31-40.txt
31#dafei#18
32#dafei#18
33#dafei#18
34#dafei#18
35#dafei#18
36#dafei#18
37#dafei#18
38#dafei#18
39#dafei#18
40#dafei#18
user41-50.txt
41#dafei#18
42#dafei#18
43#dafei#18
44#dafei#18
45#dafei#18
46#dafei#18
47#dafei#18
48#dafei#18
49#dafei#18
50#dafei#18
步骤2准备实体类
Getter
Setter
ToString
public class User {private Long id;private String name;private int age;
}
步骤3配置分区逻辑
public class UserPartitioner implements Partitioner {Overridepublic MapString, ExecutionContext partition(int gridSize) {MapString, ExecutionContext result new HashMap(gridSize);int range 10; //文件间隔int start 1; //开始位置int end 10; //结束位置String text user%s-%s.txt;for (int i 0; i gridSize; i) {ExecutionContext value new ExecutionContext();Resource resource new ClassPathResource(String.format(text, start, end));try {value.putString(file, resource.getURL().toExternalForm());} catch (IOException e) {e.printStackTrace();}start range;end range;result.put(user_partition_ i, value);}return result;}
}
步骤4全部代码
package com.langfeiyes.batch._37_step_part;import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.core.partition.PartitionHandler;
import org.springframework.batch.core.partition.support.MultiResourcePartitioner;
import org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.task.SimpleAsyncTaskExecutor;import java.util.List;SpringBootApplication
EnableBatchProcessing
public class PartStepJob {Autowiredprivate JobBuilderFactory jobBuilderFactory;Autowiredprivate StepBuilderFactory stepBuilderFactory;//每个分区文件读取BeanStepScopepublic FlatFileItemReaderUser flatItemReader(Value(#{stepExecutionContext[file]}) Resource resource){return new FlatFileItemReaderBuilderUser().name(userItemReader).resource(resource).delimited().delimiter(#).names(id, name, age).targetType(User.class).build();}Beanpublic ItemWriterUser itemWriter(){return new ItemWriterUser() {Overridepublic void write(List? extends User items) throws Exception {items.forEach(System.err::println);}};}//文件分区器-设置分区规则Beanpublic UserPartitioner userPartitioner(){return new UserPartitioner();}//文件分区处理器-处理分区Beanpublic PartitionHandler userPartitionHandler() {TaskExecutorPartitionHandler handler new TaskExecutorPartitionHandler();handler.setGridSize(5);handler.setTaskExecutor(new SimpleAsyncTaskExecutor());handler.setStep(workStep());try {handler.afterPropertiesSet();} catch (Exception e) {e.printStackTrace();}return handler;}//每个从分区操作步骤Beanpublic Step workStep() {return stepBuilderFactory.get(workStep).User, Userchunk(10).reader(flatItemReader(null)).writer(itemWriter()).build();}//主分区操作步骤Beanpublic Step masterStep() {return stepBuilderFactory.get(masterStep).partitioner(workStep().getName(),userPartitioner()).partitionHandler(userPartitionHandler()).build();}Beanpublic Job partJob(){return jobBuilderFactory.get(part-step-job).start(masterStep()).build();}public static void main(String[] args) {SpringApplication.run(PartStepJob.class, args);}
}结果
User(id31, namedafei, age18)
User(id32, namedafei, age18)
User(id33, namedafei, age18)
User(id34, namedafei, age18)
User(id35, namedafei, age18)
User(id36, namedafei, age18)
User(id37, namedafei, age18)
User(id38, namedafei, age18)
User(id39, namedafei, age18)
User(id40, namedafei, age18)
User(id41, namedafei, age18)
User(id42, namedafei, age18)
User(id43, namedafei, age18)
User(id44, namedafei, age18)
User(id45, namedafei, age18)
User(id46, namedafei, age18)
User(id47, namedafei, age18)
User(id48, namedafei, age18)
User(id49, namedafei, age18)
User(id50, namedafei, age18)
User(id21, namedafei, age18)
User(id22, namedafei, age18)
User(id23, namedafei, age18)
User(id24, namedafei, age18)
User(id25, namedafei, age18)
User(id26, namedafei, age18)
User(id27, namedafei, age18)
User(id28, namedafei, age18)
User(id29, namedafei, age18)
User(id30, namedafei, age18)
User(id1, namedafei, age18)
User(id2, namedafei, age18)
User(id3, namedafei, age18)
User(id4, namedafei, age18)
User(id5, namedafei, age18)
User(id6, namedafei, age18)
User(id7, namedafei, age18)
User(id8, namedafei, age18)
User(id9, namedafei, age18)
User(id10, namedafei, age18)
User(id11, namedafei, age18)
User(id12, namedafei, age18)
User(id13, namedafei, age18)
User(id14, namedafei, age18)
User(id15, namedafei, age18)
User(id16, namedafei, age18)
User(id17, namedafei, age18)
User(id18, namedafei, age18)
User(id19, namedafei, age18)
User(id20, namedafei, age18)
解析核心点
1文件分区器userPartitioner() 分别加载5个文件进入到程序
2文件分区处理器userPartitionHandler() 指定要分几个区由谁来处理
3分区从步骤workStep() 指定读逻辑与写逻辑
4分区文件读取flatItemReader()需要传入Resource对象这个对象在userPartitioner()已经标记为file
5分区主步骤masterStep() 指定分区名称与分区器指定分区处理器
到这本篇就结束了欲知后事如何请听下回分解~
转视频版
看文字不过瘾可以切换视频版Spring Batch高效批处理框架实战