spring batch学习笔记
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(可能有多,大家可以试探性的删掉一些不必要的包)如下:
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>${springframework.core.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aop</artifactId>
- <version>${springframework.core.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${springframework.core.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${springframework.core.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>${springframework.core.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${springframework.core.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-tx</artifactId>
- <version>${springframework.core.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.batch</groupId>
- <artifactId>spring-batch-core</artifactId>
- <version>${spring.batch.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.batch</groupId>
- <artifactId>spring-batch-infrastructure</artifactId>
- <version>${spring.batch.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.batch</groupId>
- <artifactId>spring-batch-test</artifactId>
- <version>${spring.batch.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.10</version>
- <scope>test</scope>
- </dependency>
项目构建好以后,首先开始写读取数据的逻辑,Spring
Batch针对读、写操作提供了很多实现方式,包括文件,数据库,对于数据库的操作还提供了很多ORM框架(Hibernate,iBatis,JPA)
的支持,这儿为了简单,以读文件作为例子,假设我们需要读取一个文件中所有人的信息,大于16岁的需要发信息需要发信息通知它去公安局办理身份证。简化文
件如下:
- TWer1,15
- TWer2,21
- TWer3,13
- TWer4,16
- TWer5,25
- TWer6,45
- TWer7,16
,这儿需要的Spring Batch的读文件功能就是把文件中的每一行都能转化为一个内存对象,其对应的类就是User.java
- public class User {
- String name;
- int age;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
另外,需要在message_job.xml中配置如下内容
- <bean id="messageReader" class="org.springframework.batch.item.file.FlatFileItemReader">
- <property name="lineMapper" ref="lineMapper"/>
- <property name="resource" value="/message/user.txt"/>
- </bean>
- <bean id="lineMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
- <property name="lineTokenizer" ref="lineTokenizer"/>
- <property name="fieldSetMapper" ref="fieldSetMapper"/>
- </bean>
- <bean id="fieldSetMapper" class="com.ning.demo.UserMapper"/>
- <bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"/>
,该配置文件中除了UserMapper外,都是SpringBatch默认提供的。UserMapper.java代码如下:
- public class UserMapper implements FieldSetMapper<User> {
- @Override
- public User mapFieldSet(FieldSet fieldSet) throws BindException {
- User user = new User();
- user.setName(fieldSet.readString(0));
- user.setAge(fieldSet.readInt(1));
- return user;
- }
- }
这样,文件中的每一行数据都会变成一个User类的instance。
接下来,是处理数据的过程,判断每个user的年龄,如果大于16,就生成一条Message。
- public class MessageProcessor implements ItemProcessor<User, Message> {
- @Override
- public Message process(User item) throws Exception {
- Message message = null;
- if (item.getAge() > 16) {
- message = new Message();
- message.setContent(item.getName() + ",Please come to police station!");
- }
- return message;
- }
- }
该类实现了SpringBatch的ItemProcessor接口,
最后,把处理后得到的所有Message打印到Console上,
- public class MessageWriter implements ItemWriter<Message> {
- @Override
- public void write(List<? extends Message> items) throws Exception {
- System.out.println("Results:");
- for (Message item : items) {
- System.out.println(item.getContent());
- }
- }
- }
该类实现了SpringBatch的ItemWriter接口。SpringBatch本身提供了多种Writer实现。
通过上面的几个步骤,把读数据,处理数据,写数据都构造出来了,那么那么是如何串联起来的呢?答案是配置文件,
- <batch:job id="messageJob">
- <batch:step id="messageStep">
- <batch:tasklet>
- <batch:chunk reader="messageReader" processor="messageProcessor" writer="messageWriter"
- commit-interval="10"
- chunk-completion-policy="">
- </batch:chunk>
- </batch:tasklet>
- </batch:step>
- </batch:job>
- <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
- <property name="transactionManager" ref="transactionManager"/>
- </bean>
- <bean id="messageReader" class="org.springframework.batch.item.file.FlatFileItemReader">
- <property name="lineMapper" ref="lineMapper"/>
- <property name="resource" value="/message/user.txt"/>
- </bean>
- <bean id="lineMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
- <property name="lineTokenizer" ref="lineTokenizer"/>
- <property name="fieldSetMapper" ref="fieldSetMapper"/>
- </bean>
- <bean id="fieldSetMapper" class="com.ning.demo.UserMapper"/>
- <bean id="lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"/>
- <bean id="messageProcessor" class="com.ning.demo.MessageProcessor"/>
- <bean id="messageWriter" class="com.ning.demo.MessageWriter"/>
- <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
Spring
Batch 将批处理任务称为一个 Job,同时,Job 下分为多个 Step。Step
是一个独立的、顺序的处理步骤,包含该步骤批处理中需要的所有信息。多个批处理 Step 按照一定的流程组成一个
Job。通过这样的设计方式,我们可以灵活配置 Job 的处理过程。
接下来的问题是如何运行构建好的BatchJob呢?SpringBatch提供了JobLauncher接口用于运行Job,并提供了一个默认的SimpleJobLauncher实现。
- public class Main {
- public static void main(String[] args) {
- ClassPathXmlApplicationContext c =
- new ClassPathXmlApplicationContext("message_job.xml");
- SimpleJobLauncher launcher = new SimpleJobLauncher();
- launcher.setJobRepository((JobRepository) c.getBean("jobRepository"));
- launcher.setTaskExecutor(new SimpleAsyncTaskExecutor());
- try {
- launcher.run((Job) c.getBean("messageJob"), new JobParameters());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
运
行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学习笔记的更多相关文章
- Spring Batch学习笔记三:JobRepository
此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用H ...
- Spring Batch学习笔记二
此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自 ...
- Spring Batch学习笔记(一)
Spring Batch简介 Spring Batch提供了可重复使用的功能,用来处理大量数据.包括记录.跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理. 此外还提供了更高级的技术服务和功能, ...
- 【转】Spring.NET学习笔记——目录
目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- Spring MVC 学习笔记一 HelloWorld
Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...
- SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能
在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...
- SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证
整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...
- spring揭密学习笔记
spring揭密学习笔记 spring揭密学习笔记(1) --spring的由来 spring揭密学习笔记(2)-spring ioc容器:IOC的基本概念
- Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建
Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...
随机推荐
- android listView Exception
- ::-/com.tongyan.tutelage W/System.err﹕ java.text.ParseException: Unparseable date: ) - ::-/com.ton ...
- Android 自定义ScrollView 支持惯性滑动,惯性回弹效果。支持上拉加载更多
先讲下原理: ScrollView的子View 主要分为3部分:head头部,滚动内容,fooder底部 我们实现惯性滑动,以及回弹,都是靠超过head或者fooder 就重新滚动到 ,内容的顶部或 ...
- AP_AP系列 - 费用报表分析(案例)
2014-07-08 Created By BaoXinjian
- [MySQL] 同步一张表、复制过滤设置
一.缘由 据测试要求,需要把线上一张股票信息的表实时同步到测试环境,那么干吧,这次不复制库,单独复制表. 二.解决办法 可以按照同步(复制)库的方法来,在salve端设置 my.cnf,replica ...
- c++学习-特殊类成员
静态变量: #include<iostream> #include<string> #include <typeinfo> using namespace std; ...
- FileSystemWatcher
转:http://www.cnblogs.com/zhaojingjing/archive/2011/01/21/1941586.html 注意:用FileWatcher的Created监控文件时,是 ...
- 转-TabHost组件(一)(实现底部菜单导航)
http://www.cnblogs.com/lichenwei/p/3974009.html 什么是TabHost? TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用wind ...
- Ubuntu配置网络命令(转载)
From:http://blog.csdn.net/ithomer/article/details/6264881 以eth0为例 1. 以DHCP方式配置网卡 编辑文件: /etc/networ ...
- ruby中迭代器枚举器的理解
参考<ruby编程语言>5.3迭代器和可枚举对象 迭代器一个迭代器是一个方法,这个方法里面有yield语句,这个方法里的yield语句,与传递给这个方法的块进行数据传输 yield将数据传 ...
- css选择器权值
有的时候我们为同一个元素设置了不同的CSS样式代码,那么元素会启用哪一个CSS样式呢?我们来看一下面的代码: p{color:red;} .first{color:green;} <p clas ...