Spring Batch之FlatFile操作

在看本篇博客之前,希望您能先到http://xuanmeiku.taobao.com去转转,里面全是真皮炫美酷时尚女鞋,价格实惠!如果你看中了哪一款,可以加我qq1074992674,或者直接通过旺旺联系我!欢迎大家的骚扰!本人诚信经营,绝不做欺骗他人的事情!


本文通过一个完整的实例,运用Spring Batch对FlatFile进行读写操作。此实例的流程是:读取一个含有4个字段的FlatFile(ID,Name,Age,Score),对读取的字段做简单的处理,然后输出到另外一个FlatFile中。

工程结构如下图:

Spring Batch之FlatFile操作_第1张图片

JobLaunch类用来启动Job,CSVItemProcessor类用来对Reader取得的数据进行处理,Student类是一个POJO类,用来存放映射的数据。inputFile.txt是数据读取文件,outputFile.txt是数据输出文件。

applicationContext.xml文件的配置信息与上篇文章的一致。

batch.xml文件中job配置如下:


		
			
				
			
		
	
这个文件里配置了这次运行的JOB:csvJob。本Job包含一个Step,完成一个完整FlatFile的读写功能。分别由csvItemReader完成FlatFile的读操作,由csvItemProcessor完成对取得数据的处理,由csvItemWriter完成对FlatFile的写操作。

batch.xml文件中csvItemReader配置如下:


	
		
		
			
				
				
					
						
					
				
			
		
	
	
	
	
		
		
			
				ID
				name
				age
				score
			
		
	
csvItemReader实现的是Spring Batch提供FlatFileItemReader类,此类主要用于Flat文件的读操作。它包含两个必要的属性resource和lineMapper。前者制定要读取文件的位置,后者是将文件的每一行映射成一个Pojo对象。其中lineMapper也有两个重要属性lineTokenizer和fieldSetMapper,lineTokenizer将文件的一行分解成一个FieldSet,然后由FieldSetMapper映射成Pojo对象。

这种方式与DB的读操作非常类似。lineMapper类似于ResultSet,文件中一行类似于Table中的一条记录,被封装成FieldSet,类似于RowMapper。至于怎么将一条记录封装,这个工作由lineTokenizer的继承类DelimitedLineTokenizer完成。DelimitedLineTokenizer的delimiter属性决定文件的一行数据按照什么分解,默认是“,”,names属性标识分解的每个字段的名字,传给fieldSetMapper(本实例使用的是BeanWrapperFieldSetMapper)的时候,就可以按照这个名字取得相应的值。fieldSetMapper的属性prototypeBeanName,是映射POJO类的名字。设置了此属性后,框架就会将lineTokenizer分解成的一个FieldSet映射成Pojo对象,映射是按照名字来完成的(lineTokenizer分解时标注的名字与Pojo对象中字段的名字对应)。

总之,FlatFileItemReader读取一条记录由以下四步完成:1,从resource指定的文件中读取一条记录;2,lineTokenizer将这条记录按照delimiter分解成Fileset,每个字段的名字由names属性取得;3,将分解成的Fileset传递给fieldSetMapper,由其按照名字映射成Pojo对象;4,最终由FlatFileItemReader将映射成的Pojo对象返回,框架将返回的对象传递给Processor。

      csvItemProcessor实现的是ItemProcessor类。此类接受Reader映射成的Pojo对象,可以对此对象做相应的业务逻辑处理,然后返回,框架就会将返回的结果传递给Writer进行写操作。具体实现代码如下:

package cn.lichunan.springbatch.processor;

import org.springframework.batch.item.ItemProcessor;
import cn.lichunan.springbatch.pojo.Student;

/**
 *ItemProcessor类
 */
public class CsvItemProcessor implements ItemProcessor{

	/**
	 * 对取得的数据进行简单的处理
	 * @param student 处理前的数据
	 * @return 处理后的数据
	 * @exception Exception 处理发生的任何异常
	 */
	public Student process(Student student) throws Exception {
		/**合并ID和名字*/
		student.setName(student.getID() + "--" + student.getName());
		/**年龄加2*/
		student.setAge(student.getAge() + 2);
		/**分数加10*/
		student.setScore(student.getScore() + 10);
		/**将处理后的结果传递给writer*/
		return student;
	}

}
batch.xml文件中csvItemWriter的配置如下:


	
		
		
			
				
				
					
						
					
				
			
		
	

csvItemWriter实现的是FlatFileItemWriter类。此类与FlatFileItemReader类相似,也有两个重要的属性:resource和lineAggregator。前者是要输出的文件的路径,后者和lineTokenizer类似。lineAggregator(本实例用DelimitedLineAggregator类)也有两个重要的属性:delimiter和fieldExtractor。Delimiter标示输出的字段以什么分割,后者将Pojo对象组装成由Pojo对象的字段组成的一个字符串。同样FlatFileItemWriter写一条记录也有以下四步完成:1,Processor传递过来一个对象给lineAggregator;2,lineAggregator将其这个对象转化成一个数组;3,再由lineAggregator的属性fieldExtractor将数组转化成按照delimiter分割一个字符串;4,将这个字符串输出。

      这样,一条数据的读、处理、写操作就基本完成了。当然,读和写也可以自己写类来处理,只是要注意继承FlatFileItemReader和FlatFileItemWriter就可以了。

      实例中用到的Student类代码如下:

package cn.lichunan.springbatch.pojo;

public class Student {
	private String ID;
	private String name;
	private String age;
	private String score;
	
	public String getID() {
		return ID;
	}
	
	public void setID(String iD) {
		ID = iD;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getAge() {
		return age;
	}
	
	public void setAge(String age) {
		this.age = age;
	}
	
	public String getScore() {
		return score;
	}
	
	public void setScore(String score) {
		this.score = score;
	}
	
	
}
Spring Batch之FlatFile操作_第2张图片

本文配置注意如下:

1、注意Writer的resource要写成“file:******”形式,不能用“classpath:******”形式。

2、如果将Job配置中commit-interval属性配置为大于1时,每次commit的都是最后一条记录,前面读取的被覆盖了。

你可能感兴趣的:(springbatch)