此系列博客皆为学习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的一些相关的类和接口:

  1. org.springframework.batch.core.Job:表示一个Job,同时也提供了执行Job的能力;
  2. org.springframework.batch.core.Step:表示一个step,同时也提供了执行Step的能力;
  3. org.springframework.batch.item.ItemReader<T>:提供了读取数据的能力;
  4. org.springframework.batch.item.ItemProcessor<T>:我们可以通过它应用业务逻辑到每一条要处理的数据;
  5. 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学习笔记二的更多相关文章

  1. Spring Batch学习笔记三:JobRepository

    此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用H ...

  2. spring batch学习笔记

    Spring Batch是什么?       Spring Batch是一个基于Spring的企业级批处理框架,按照我师父的说法,所有基于Spring的框架都是使用了spring的IoC特性,然后加上 ...

  3. spring boot 学习笔记(二) 构建web支持jsp

    一.必须将项目打包成war包 <packaging>war</packaging> 二.pom.xml加入依赖包 <dependency> <groupId& ...

  4. spring mvc学习笔记二:@RequestMapping

    @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. @RequestMapp ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  8. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  9. 【转】Spring.NET学习笔记——目录

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

随机推荐

  1. 编译lsusb

    参考博客: http://blog.csdn.net/mcy_cool/article/details/10178841 涉及到的源码: http://files.cnblogs.com/files/ ...

  2. ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇

    在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identity,因为它已经对OWIN 有了良好的集成. 在这篇文章中,我主要关注ASP. ...

  3. HTML5+JS 《五子飞》游戏实现(四)夹一个和挑一对

    在第一章我们已经说了怎么才能“夹一个”以及怎样才能挑一对,但那毕竟只是书面上的,对码农来讲,我们还是用代码讲解起来会更容易了解. 为了更容易对照分析,我们先把路线再次贴出来: // 可走的路线 thi ...

  4. VS2012旗舰版接选择调试 出现了这样一个错误

    问题: 解决: 项目-右键-属性,勾选如下配置试试

  5. 2.1 LibCurl编程流程(转)

    转载地址:http://blog.chinaunix.net/u/17660/showart_1822514.html2 LibCurl编程2.1 LibCurl编程流程在基于LibCurl的程序里, ...

  6. Java复数的四则运算

    import java.util.Scanner;   import com.sun.jndi.url.iiopname.iiopnameURLContextFactory;   public cla ...

  7. #Linux学习笔记# 自定义shell终端提示符

    我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...

  8. 使用goldengate交付指定时间前的数据

    在数据同步过程中,客户担心在源端误操作,比如truncate, drop, delete all等,在目标端也会立即同步,而无法挽救损失:因此,客户希望是目标端的数据比源端要慢一个时间点. 解决方案: ...

  9. super的用法

    1.调用父类的构造方法子类可以调用由父类声明的构造方法.但是必须在子类的构造方法中使用super关键字来调用. 2.操作被隐藏的成员变量和被覆盖的成员方法如果想在子类中操作父类中被隐藏的成员变量和被覆 ...

  10. [转] C# 绘制报表,使用Graphics.DrawString 方法

    原文 Graphics.DrawString 方法 在指定位置并且用指定的 Brush 和Font 对象绘制指定的文本字符串. public void DrawString( string s, Fo ...