Spring Batch学习笔记二
此系列博客皆为学习Spring Batch时的一些笔记;
Spring Batch的架构
一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行;
Step代表一个自定义的工作单元,它是Job的主要构件块;每一个Step由三部分组成:ItemReader、ItemProcessor、ItemWriter;这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化;ItemProcessor不是必须的,一个Step可以仅仅包含ItemReader和ItemWriter;如果你不需要去读写任何数据,你可以仅仅在一个Step中包含一个Tasklet(等价于ItemProcessor);
组成Spring Batch的一些相关的类和接口:
- org.springframework.batch.core.Job:表示一个Job,同时也提供了执行Job的能力;
- org.springframework.batch.core.Step:表示一个step,同时也提供了执行Step的能力;
- org.springframework.batch.item.ItemReader<T>:提供了读取数据的能力;
- org.springframework.batch.item.ItemProcessor<T>:我们可以通过它应用业务逻辑到每一条要处理的数据;
- org.springframework.batch.item.ItemWriter<T>:提供了写数据的能力
Spring Batch通过这种方式构建一个Job的优点在于解耦每一个Step到它自己独立的处理器当中;每一个Step负责得到数据、应用业务逻辑到这些数据、写数据到适当的位置;
一个Tasklet是一种特别的Step类型,在没有ItemReader和ItemWriter的情况下,使用它来执行一个功能;tasklet仅仅能被使用作一个单一的功能,如执行一些初始化、调用一个存储过程、发送一个邮件通知Job已经完成。
运行Job
首先看下面这个图,描述了Job的各个组件及其关系:

你会发现JobRepository这个组件会和多个其它组件发生联系,它代表一个数据存储(内存或者外部数据库),被用来持久化Job或Step执行过程中用到的信息(用JobExecution和StepExecution来表示);
Job通过JobLauncher开始执行,JobLauncher通过检查JobRepository来核实Job在之前是否运行过,并且验证传入到Job的参数,最后执行Job;
Job的执行流程和Step非常相似,Job首先实行每一个它包含的Step,当数据处理完成后,它将执行的结果更新到JobRepository的JobExecution和StepExecution中;Step首先通过ItemReader读取每一个它要处理的数据项,交由StepPrpcessor处理,同时更新JobRepository中的StepExecution数据。一些信息如Commit次数、开始结束时间都会被存储到JobRepository中,当一个Job/Step完成后,在JobRepository中相关的执行信息会被更新至最终状态。
并行运算
在Spring Batch中,并行可以通过以下四种方式实现:
- 将Step多线程化:在Spring Batch里面,我们把Job被配置去处理的工作块称为Chunk,每一个Chunk被处理完成后,都会执行一次Commit;这些Chunk依次执行,假如有10000条记录,一次处理50条,那么job会在1到50条记录完成后Commit,然后在51到100条记录完成后再次Commit;如果我们在Step中开启3个线程,那么将增加3倍的处理能力:

- 并行的执行Step:假设我们有两个Step,每一个都负责加载一个输入文件的数据到数据库中,这两个Step之间没有相互的依赖关系,我们则可以让这两个Step并行执行:

- 远程chunking:前两种方式都是在一个JVM里面去处理,这种方式允许你扩展你的处理跨多个JVM实例,其中一个JVM作为主节点,它通过一个ItemReader读取输入数据,然后通过网络将数据发送到其它的JVM实例上(称之为从节点)进行处理,处理完成后,从节点又将处理的结果发送回主结点,主结点通过ItemWriter输出;
- 分区:这种方式不需要跨多个JVM实例,因此不需要网络数据传输,但依然使用了主从配置;也就是说一个Step作为主Step,它扮演了其它多个从Step的控制器;它通过一个ItemReader读取输入数据,然后传递给从Step进行处理,处理完成后从Step又将处理的结果传递回主Step:

实例Job
Spring Batch提供了很多简单的Job实例,让你在开发你自定义的批处理应用程序时参考:
- adhocLoopJob:演示了一个无限循环的Job,通过JMX去暴露元素;
- beanWrapperMapperSampleJob:演示了如何实现基于文件的输入数据的验证和将文件字段映射到域对象;
- compositeItemWriterSampleJob:一个Step只能包含一个ItemReader和ItemWriter,这个Job教你如何绕开这个限制;
- customerFilterJob:演示如何使用一个ItemProcessor过滤无效的Customer;
- delegatingJob:使用ItemReaderAdapter,将输入数据的读取行为委托给一个POJO的某个方法;
- footballJob:一个足球赛事统计Job,在加载两个输入文件(一个文件是运动员数据,一个文件是赛事数据)之后,产生一个统计信息并输出到日志文件;
- groovyJob:演示运行由groovy编写的文件压缩和解压的脚本;
- headerFooterSample:演示如何使用回调,在输出的时候添加Header和Footer;
- hibernateJob:Spring Batch Reader和Writer默认不会使用Hibernate,这个Job演示了如何整合Hibernate;
- infiniteLoopJob:一个无限循环Job,在Job停止后自动重启;
- ioSampleJob:提供了很多不同IO方式的例子,如读取分隔符文件、固定长度字段的文件、Xml、JDBC、iBATIS集成;
- jobSampleJob:演示了如何从一个Job中执行另外一个Job;
- loopFlowSample:演示如何用编程的方式去控制执行流程;
- mailJob:演示如何使用SimpleMailMessageItemWriter去发送eMail;
Spring Batch学习笔记二的更多相关文章
- Spring Batch学习笔记三:JobRepository
此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用H ...
- spring batch学习笔记
Spring Batch是什么? Spring Batch是一个基于Spring的企业级批处理框架,按照我师父的说法,所有基于Spring的框架都是使用了spring的IoC特性,然后加上 ...
- Spring Batch学习笔记(一)
Spring Batch简介 Spring Batch提供了可重复使用的功能,用来处理大量数据.包括记录.跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理. 此外还提供了更高级的技术服务和功能, ...
- Spring Boot学习笔记二
Spring Boot入门第二篇 第一天的详见:https://www.cnblogs.com/LBJLAKERS/p/12001253.html 同样是新建一个pring Initializer快速 ...
- spring boot 学习笔记(二) 构建web支持jsp
一.必须将项目打包成war包 <packaging>war</packaging> 二.pom.xml加入依赖包 <dependency> <groupId& ...
- Spring Boot学习笔记(二二) - 与Mybatis集成
Mybatis集成 Spring Boot中的JPA部分默认是使用的hibernate,而如果想使用Mybatis的话就需要自己做一些配置.使用方式有两种,第一种是Mybatis官方提供的 mybat ...
- spring cloud学习笔记二 ribbon负载均衡
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求.Ribb ...
- Spring.Net学习笔记(二)-数据访问器
Spring对ADO.NET也提供了支持,依赖与程序集Spring.Data.dll IDbProvider IDbProvider定义了数据访问提供器的基础,配置如下 <?xml versio ...
- spring mvc学习笔记二:@RequestMapping
@RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. @RequestMapp ...
随机推荐
- 在Unity中使用TDD - 初探
描述 Editor Tests Runner是Unity中用来实现TDD的,其内部实现是基于NUnit. 其他 测试脚本要放在Editor文件夹中,测试要能够在一帧的时间内完成. 使用 打开Edito ...
- matlab处理图像代码
1.图像的读取MATLAB中从图像文件中读取数据用函数imread(),这个函数的作用就是将图像文件的数据读入矩阵中,此外还可以用imfinfo()函数查看图像文件的信息(见例1)%例1:图像数据及图 ...
- 机器学习常用Python扩展包
在Ubuntu下安装Python模块通常有3种方法:1)使用apt-get:2)使用pip命令(推荐);3)easy_instal 可安装方法参考:[转]linux和windows下安装python集 ...
- 【偶像大师 白金星光】的【Variable Tone】技术大公开!偶像从哪里看都那么可爱,VA小组谈制作方针
http://game.watch.impress.co.jp/docs/news/1016369.html 自从街机版的运营依赖,今年迎来了[偶像大师]系列的11周年.在CEDEC ...
- 事务处理-回滚(转账操作)(转自http://www.cnblogs.com/void-m/p/6143540.html)
JDBC事务处理-四大原则 原子性一致性隔离性持久性 第一步:实现转账操作 假设在账户中,盖伦有余额5000元,赵信有余额2000元, 盖伦要向赵信转账1000元. 1 2 3 4 5 6 7 8 9 ...
- php 后端开发学习
hello.php: <?php //设置cookies setcookie("user", "runoob", time()+3600); ?> ...
- xcode8升级后问题总汇
一.注释快捷键无法使用 command + / 快捷键无法使用,在终端执行以下命令,然后重启Xcode即可. 1 sudo /usr/libexec/xpccachectl 二.注释快捷键 Xco ...
- 解决界面有搜索栏时,点击TableView的空白界面,键盘不消失的问题
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(h ...
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- CS193P - 2016年秋 第三讲 Swift 语言及 Foundation 框架
这一讲介绍一些 Swift 的重点概念.特别是一些有别于其它语言的地方.但本质上还都是语法糖. 想充分理解这一讲的内容,最好的方式就是 打开 playgound,亲自动手来实验. 1,Optional ...