Spring Batch是什么?
      Spring
Batch是一个基于Spring的企业级批处理框架,按照我师父的说法,所有基于Spring的框架都是使用了spring的IoC特性,然后加上自己
的一些处理规则。因此,要理解Spring Batch的设计和使用,首先需要理解批处理的机制和特点。

      所谓企业批处理就是指在企业级应用中,不需要人工干预,定期读取数据,进行相应的业务处理之后,再进行归档的这类操作。从上面的描述中可以看出,批处理的整个流程可以明显的分为3个阶段:

         1、读数据

         2、业务处理

         3、归档结果数据

另外,从定义中可以发现批处理的一个重要特色就是无需人工干预、定期执行,因此一个批处理框架,需要关注事务的粒度,日志监控,执行方式,资源管理,读数据,处理数据,写数据的解耦等方面。

      SpringBatch为我们提供了什么呢?

       1、统一的读写接口

       2、丰富的任务处理方式、

       3、灵活的事务管理及并发处理

       4、日志、监控、任务重启与跳过等特性

注意,Spring Batch未提供关于批处理任务调度的功能,因此如何周期性的调用批处理任务需要自己想办法解决,就Java来说,Quartz是一个不错的解决方案,或者写脚本处理之。

Spring Batch First Demo

      前面讲了很多Spring Batch的特性,接下来就通过一个小例子来看看Spring Batch是如何实现 批处理的读数据-》处理数据-》归档结果这一过程的。

       首先,搭建项目框架,推荐大家使用Maven或者Gradle结构的项目,不会的,赶紧学学,对于学习新技术省很多时间。一个Spring项目需要依赖的lib(可能有多,大家可以试探性的删掉一些不必要的包)如下:

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-beans</artifactId>
  4. <version>${springframework.core.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-aop</artifactId>
  9. <version>${springframework.core.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework</groupId>
  13. <artifactId>spring-context</artifactId>
  14. <version>${springframework.core.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring-core</artifactId>
  19. <version>${springframework.core.version}</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework</groupId>
  23. <artifactId>spring-jdbc</artifactId>
  24. <version>${springframework.core.version}</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework</groupId>
  28. <artifactId>spring-test</artifactId>
  29. <version>${springframework.core.version}</version>
  30. <scope>test</scope>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-tx</artifactId>
  35. <version>${springframework.core.version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.batch</groupId>
  39. <artifactId>spring-batch-core</artifactId>
  40. <version>${spring.batch.version}</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework.batch</groupId>
  44. <artifactId>spring-batch-infrastructure</artifactId>
  45. <version>${spring.batch.version}</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.batch</groupId>
  49. <artifactId>spring-batch-test</artifactId>
  50. <version>${spring.batch.version}</version>
  51. <scope>test</scope>
  52. </dependency>
  53. <dependency>
  54. <groupId>junit</groupId>
  55. <artifactId>junit</artifactId>
  56. <version>4.10</version>
  57. <scope>test</scope>
  58. </dependency>

项目构建好以后,首先开始写读取数据的逻辑,Spring
Batch针对读、写操作提供了很多实现方式,包括文件,数据库,对于数据库的操作还提供了很多ORM框架(Hibernate,iBatis,JPA)
的支持,这儿为了简单,以读文件作为例子,假设我们需要读取一个文件中所有人的信息,大于16岁的需要发信息需要发信息通知它去公安局办理身份证。简化文
件如下:

  1. TWer1,15
  2. TWer2,21
  3. TWer3,13
  4. TWer4,16
  5. TWer5,25
  6. TWer6,45
  7. TWer7,16

,这儿需要的Spring Batch的读文件功能就是把文件中的每一行都能转化为一个内存对象,其对应的类就是User.java

  1. public class User {
  2. String name;
  3. int age;
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public int getAge() {
  11. return age;
  12. }
  13. public void setAge(int age) {
  14. this.age = age;
  15. }
  16. }

另外,需要在message_job.xml中配置如下内容

  1. <bean id="messageReader" class="org.springframework.batch.item.file.FlatFileItemReader">
  2. <property name="lineMapper" ref="lineMapper"/>
  3. <property name="resource" value="/message/user.txt"/>
  4. </bean>
  5. <bean id="lineMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
  6. <property name="lineTokenizer" ref="lineTokenizer"/>
  7. <property name="fieldSetMapper" ref="fieldSetMapper"/>
  8. </bean>
  9. <bean id="fieldSetMapper" class="com.ning.demo.UserMapper"/>
  10. <bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"/>

,该配置文件中除了UserMapper外,都是SpringBatch默认提供的。UserMapper.java代码如下:

  1. public class UserMapper implements FieldSetMapper<User> {
  2. @Override
  3. public User mapFieldSet(FieldSet fieldSet) throws BindException {
  4. User user = new User();
  5. user.setName(fieldSet.readString(0));
  6. user.setAge(fieldSet.readInt(1));
  7. return user;
  8. }
  9. }

这样,文件中的每一行数据都会变成一个User类的instance。

      接下来,是处理数据的过程,判断每个user的年龄,如果大于16,就生成一条Message。

  1. public class MessageProcessor implements ItemProcessor<User, Message> {
  2. @Override
  3. public Message process(User item) throws Exception {
  4. Message message = null;
  5. if (item.getAge() > 16) {
  6. message = new Message();
  7. message.setContent(item.getName() + ",Please come to police station!");
  8. }
  9. return message;
  10. }
  11. }

该类实现了SpringBatch的ItemProcessor接口,

最后,把处理后得到的所有Message打印到Console上,

  1. public class MessageWriter implements ItemWriter<Message> {
  2. @Override
  3. public void write(List<? extends Message> items) throws Exception {
  4. System.out.println("Results:");
  5. for (Message item : items) {
  6. System.out.println(item.getContent());
  7. }
  8. }
  9. }

该类实现了SpringBatch的ItemWriter接口。SpringBatch本身提供了多种Writer实现。

通过上面的几个步骤,把读数据,处理数据,写数据都构造出来了,那么那么是如何串联起来的呢?答案是配置文件,

  1. <batch:job id="messageJob">
  2. <batch:step id="messageStep">
  3. <batch:tasklet>
  4. <batch:chunk reader="messageReader" processor="messageProcessor" writer="messageWriter"
  5. commit-interval="10"
  6. chunk-completion-policy="">
  7. </batch:chunk>
  8. </batch:tasklet>
  9. </batch:step>
  10. </batch:job>
  11. <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
  12. <property name="transactionManager" ref="transactionManager"/>
  13. </bean>
  14. <bean id="messageReader" class="org.springframework.batch.item.file.FlatFileItemReader">
  15. <property name="lineMapper" ref="lineMapper"/>
  16. <property name="resource" value="/message/user.txt"/>
  17. </bean>
  18. <bean id="lineMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
  19. <property name="lineTokenizer" ref="lineTokenizer"/>
  20. <property name="fieldSetMapper" ref="fieldSetMapper"/>
  21. </bean>
  22. <bean id="fieldSetMapper" class="com.ning.demo.UserMapper"/>
  23. <bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"/>
  24. <bean id="messageProcessor" class="com.ning.demo.MessageProcessor"/>
  25. <bean id="messageWriter" class="com.ning.demo.MessageWriter"/>
  26. <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>

Spring
Batch 将批处理任务称为一个 Job,同时,Job 下分为多个 Step。Step
是一个独立的、顺序的处理步骤,包含该步骤批处理中需要的所有信息。多个批处理 Step 按照一定的流程组成一个
Job。通过这样的设计方式,我们可以灵活配置 Job 的处理过程。

接下来的问题是如何运行构建好的BatchJob呢?SpringBatch提供了JobLauncher接口用于运行Job,并提供了一个默认的SimpleJobLauncher实现。

  1. public class Main {
  2. public static void main(String[] args) {
  3. ClassPathXmlApplicationContext c =
  4. new ClassPathXmlApplicationContext("message_job.xml");
  5. SimpleJobLauncher launcher = new SimpleJobLauncher();
  6. launcher.setJobRepository((JobRepository) c.getBean("jobRepository"));
  7. launcher.setTaskExecutor(new SimpleAsyncTaskExecutor());
  8. try {
  9. launcher.run((Job) c.getBean("messageJob"), new JobParameters());
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }


行BatchJob时需要为 JobLauncher 指定一个 JobRepository,该类负责创建一个 JobExecution 对象来执行
Job,其次,需要指定一个任务执行器,我们使用 Spring Batch 提供的 SimpleAsyncTaskExecutor。最后,通过
run 方法来执行指定的 Job。运行结果如下:

Results:

TWer2,Please come to police station!

TWer5,Please come to police station!

TWer6,Please come to police station!

转:http://ningandjiao.iteye.com/blog/1616584

spring batch学习笔记的更多相关文章

  1. Spring Batch学习笔记三:JobRepository

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

  2. Spring Batch学习笔记二

    此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自 ...

  3. Spring Batch学习笔记(一)

    Spring Batch简介 Spring Batch提供了可重复使用的功能,用来处理大量数据.包括记录.跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理. 此外还提供了更高级的技术服务和功能, ...

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

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

  5. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  6. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  7. SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证

    整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...

  8. spring揭密学习笔记

    spring揭密学习笔记 spring揭密学习笔记(1) --spring的由来 spring揭密学习笔记(2)-spring ioc容器:IOC的基本概念

  9. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

随机推荐

  1. HTTP 基础知识

    HTTP是一种协议.HTTP使用流程,一般情况下, 第一:由HTTP客户端发出请求,创建端口. 第二:HTTP服务器在端口监听客户端的请求. 第三:一旦收到请求,HTTP服务器向客户端返回状态和内容. ...

  2. AppCan学习笔记----关闭页面listview动态加载数据

    AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...

  3. 初探微信小程序

    摘要 最近闲下来了,就准备了解下微信小程序的内容.首先从目录结构开始吧. 创建项目 工具下载:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/do ...

  4. effetive C++ 02 尽量以const,enum,inline替换#define

    #define ASPECT_RATIO=1.1const double AspectRatio=1.1 1. 使用宏会导致预处理器把程序代码中的ASPECT_RATIO无条件替换为1.1,编译器从未 ...

  5. 40-cut 简明笔记

    从输入行中选取字符或者字段 cut [options] [file-list] cut 从输入行中选取字符或者字段,并将他们写到标准输出,字符和字段从1开始编号 参数 file-list 是文件的路径 ...

  6. mongodb 与 c++ 的配合使用

    最近在尝试使用 mongodb 作为服务端持久化方案,服务端程序是使用 c++ 写的,折腾了不少时间,记录一下吧. 1.下载 boost 1.56.0 http://www.boost.org/use ...

  7. Windows server 2003 WINS的配置和使用详解

    NetBios名称概述 网络中的一台计算机可以使用NETBIOS和DNS两种命名方式为其命名,在NETBIOS标准中,使用长度不超 过16个字符的名称来惟一标识每个网络资源,用于标识资源或服务类型.在 ...

  8. Spring字符集过滤器CharacterEncodingFilter

    Spring中的字符集过滤器可以很方便的为我们解决项目中出现的中文乱码问题,而且使用方法也很简单,只需要在web.xml文件中配置一下该过滤器,设置两个重要的参数(encoding和forceEnco ...

  9. ASP.NET Core 1.0

    .NET Core dotnet 命令大全:http://www.cnblogs.com/linezero/p/dotnet.html http://www.cnblogs.com/Wddpct/p/ ...

  10. 浅析Mysql数据回滚错误的解决方法

    介绍一下关于Mysql数据回滚错误的解决方法.需要的朋友可以过来参考下   MYSQL的事务处理主要有两种方法.   1.用begin,rollback,commit来实现   begin 开始一个事 ...