网站首页 > 技术文章 正文
1 前言
前面写了一篇文章《通过例子讲解Spring Batch入门,优秀的批处理框架 》讲解Spring Batch入门,但要发挥它的作用,并行处理不能不了解。
2 四种模式
大多数情况下,单线程、单进程的Spring Batch已经能满足你的需求。在我们走向更复杂的特性之前,先看看简单的能不能用,Keep it Simple and Stupid。
不过,当你确定要使用并行处理时,Spring Batch也提供了多种选择。整体上分为两大类:
- (1)单进程、多线程
- (2)多进程
细分如下:
- (1)多线程的Step(单进程)
- (2)并行的Steps(单进程)
- (3)远程分块(多进程)
- (4)远程分区(多进程)
光从名字看,很难理解它们之间的差别,我们来一一介绍吧。
2.1 多线程的Step
通过提供一个TaskExecutor来执行,而TaskExecutor是可以自定义的,我们可以提供一个基于线程池的TaskExecutor,则可以实现多线程处理。
@Bean
public TaskExecutor taskExecutor(){
return new SimpleAsyncTaskExecutor("spring_batch");
}
@Bean
public Step sampleStep(TaskExecutor taskExecutor) {
return this.stepBuilderFactory.get("sampleStep")
.<String, String>chunk(10)
.reader(itemReader())
.writer(itemWriter())
.taskExecutor(taskExecutor)
.build();
}
2.2 并行Steps
这个看起来跟第一个很像,其实完全不一样。它是多个steps之间来并行处理。所以job应该是可以分解为独立的step,不是按一步一步的顺序处理,这样才可以并行执行。比如下面的例子,step1和step2合并成一个flow1,而step3为flow2,flow1与flow2之间可以并行处理。
代码如下:
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(splitFlow())
.next(step4())
.build() //builds FlowJobBuilder instance
.build(); //builds Job instance
}
@Bean
public Flow splitFlow() {
return new FlowBuilder<SimpleFlow>("splitFlow")
.split(taskExecutor())
.add(flow1(), flow2())
.build();
}
@Bean
public Flow flow1() {
return new FlowBuilder<SimpleFlow>("flow1")
.start(step1())
.next(step2())
.build();
}
@Bean
public Flow flow2() {
return new FlowBuilder<SimpleFlow>("flow2")
.start(step3())
.build();
}
@Bean
public TaskExecutor taskExecutor(){
return new SimpleAsyncTaskExecutor("spring_batch");
}
2.3 远程分块
在这种模式下,step会被拆成多个Java进程来处理,主程序与分块执行程序之间通过中间件来通信。如下图所示:
由上图可以看出,读取只有一个进程Manager,而处理进程Worker则可以多个,所以适用于易读而难处理的场景。
2.4 远程分区
远程分区跟远程分块容易混淆,但其实它们是不同的。前面讲解的远程分块是一个进程读,多个进程处理;而远程分区是多个进程读,多个进程处理,多个进程写:
所以,远程分区适用于容易有IO瓶颈的系统,因为它将读与写都拆到多个worker进程中去了。远程分区可以使用中间件,如消息队列,也可以不用。它通过PartitionHandler来进行分区处理,而Partitioner则定义了如何进行分区。
3 总结
本文介绍了Spring Batch并行处理的四种模式,分别是多线程Step、并行Steps、远程分块、远程分区。前两种比较简单,给出代码例子;而后两种则复杂得多,特别是远程分区模式,把IO压力和业务处理压力都分解了,能大大提高整个流程的处理效率。后续我们再专门讲解一下远程分区吧。
多读书,多分享;多写作,多整理。
- 上一篇: SpringBatch简介
- 下一篇: Spring Boot 中批量处理任务的实现攻略
猜你喜欢
- 2025-05-23 五分钟搞懂 - Job启动与监控
- 2025-05-23 Spring Data JPA避坑指南:99%新手踩过的坑我都帮你填平了!
- 2025-05-23 Spring Framework 6.2 和 Spring Boot 3.4 为 2025 年新一代做好准备
- 2025-05-23 SpringBoot中14个日志使用技巧
- 2025-05-23 SpringBoot 数据验证与表单处理全面指南(史上最全)
- 2025-05-23 阿里P8大牛耗费三年整理的:Java架构之完美设计实战PDF
- 2025-05-23 Spring Boot+Vue全栈开发实战,中文版高清PDF资源
- 2025-05-23 Spring Integration实战:高效系统集成的7个核心技巧
- 2025-05-23 《github精选系列》——SpringBoot 全家桶
- 2025-05-23 SpringBoot面试专题及答案
- 最近发表
-
- Qt编程进阶(63):Qt Quick高级控件的使用
- Qt编程进阶(47):QML鼠标事件处理(qt编程难不难)
- 使用Xamarin和Visual Studio开发Android可穿戴设备应用
- Qt使用教程:创建Qt Quick应用程序(三)
- QML性能优化 | 常见界面元素优化(qml布局自适应大小)
- Qt使用教程:创建移动应用程序(二)
- Qt Quick 多媒体开发播放音乐和视频
- Qt使用教程:创建Qt Quick UI表单(三)
- 如何将 Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?
- QML控件:TextInput, TextField, TextEdit, TextArea用法及自定义
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- nfs (25)
- springbatch (28)
- oracle数据库备份 (25)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- c 数组 (33)
- pascal语言教程 (23)
- ppt 教程 (35)
- java7 (24)
- 自适应网站制作 (32)
- server服务自动停止 (25)
- 超链接去掉下划线 (34)
- 什么是堆栈 (22)
- map entry (25)
- ubuntu装qq (25)
- outputstreamwriter (26)
- fill_parent (22)