在看本篇博客之前,希望您能先到http://xuanmeiku.taobao.com去转转,里面全是真皮炫美酷时尚女鞋,价格实惠!如果你看中了哪一款,可以加我qq1074992674,或者直接通过旺旺联系我!欢迎大家的骚扰!本人诚信经营,绝不做欺骗他人的事情!
本文主要探讨Spring Batch读取复合格式的数据,然后写入不同的文件的处理方式。
工程结构如下图:
applicationContext.xml文件已经在前面的文章中叙述过。
本实例的核心配置文件batch.xml内容如下:
student
ID
name
age
score
配置了Reader的基本信息。FlatFileItemReader的lineMapper属性使用SpringBatch核心类PatternMatchingCompositeLineMapper的时候,会将读取的记录按照不同的方式映射成我们的Pojo对象。当然首先我们要配置不同的tokenizers和fieldSetMappers,并告诉它当前的记录按照那条原则去解析和映射。我们指定key为student*的时候,用studentTokenizer去解析成fieldset,用studentFieldSetMapper将studentTokenizer解析好的fieldset记录映射成Student对象。我们指定的key,其实也就是student开头的记录,*是通配符。PatternMatchingCompositeLineMapper支持两种通配符:*和?,前者代表多个字符,后者仅代表一个字符。至于student和goods信息如何映射成pojo对象,前面的文章中已经做过详细的介绍,这里就不做赘述了。配置了Writer的基本信息。Writer也是使用代理的方式,学生信息使用定义的studentWriter按照固定长的格式写入学生信息文件中,商品信息使用定义的goodsWriter按照CSV的格式写入商品信息文件中。MultiItemWriter的代码很简单,就不做详细解释了。如下:
package cn.lichunan.springbatch.writer;
import java.util.ArrayList;
import java.util.List;
import org.springframework.batch.item.ItemWriter;
import cn.lichunan.springbatch.pojo.Goods;
import cn.lichunan.springbatch.pojo.Student;
/**
* 写处理类
* @author soft
* @param
*
*/
public class MultiItemWriter implements ItemWriter{
/**写代理*/
private List> delegates;
public void setDelegates(List> delegates) {
this.delegates = delegates;
}
public void write(List extends T> items) throws Exception {
//学生信息的Writer
ItemWriter studentWriter = (ItemWriter) delegates.get(0);
//商品信息的Writer
ItemWriter goodsWriter = (ItemWriter)delegates.get(1);
//学生信息
List studentList = new ArrayList();
//商品信息
List goodsList = new ArrayList();
//将传过来的信息按照不同的类型添加到不同的List中
for(T t: items){
if("Student".equals(t.getClass().getSimpleName())){
studentList.add((Student)t);
}else{
goodsList.add((Goods)t);
}
}
//如果学生List中有数据,就执行学生信息的写
if(studentList.size() > 0){
studentWriter.write(studentList);
}
//如果商品List中有数据,就执行商品信息的写
if(goodsList.size() > 0){
goodsWriter.write(goodsList);
}
}
}
至此,复合文件的读写操作已经讨论结束了。注意实例没有配置Processor。下面是一些辅助文件的信息。
student和goods类的信息与前面文章一样,就不再贴出代码了。
Job启动的代码如下
package cn.lichunan.springbatch.launch;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Launch {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"batch.xml");
JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean("multiTypeSingleFileJob");
try {
JobExecution result = launcher.run(
job,
new JobParametersBuilder()
.addString(
"inputFilePath",
"E:\\workspace-springbatch\\springbatch-MultiTypesSingleFile\\src\\main\\resource\\multiTypesInput.txt")
.addString(
"outputFilePathStudent",
"E:\\workspace-springbatch\\springbatch-MultiTypesSingleFile\\src\\main\\resource\\student.txt")
.addString(
"outputFilePathGoods",
"E:\\workspace-springbatch\\springbatch-MultiTypesSingleFile\\src\\main\\resource\\goods.txt")
.toJobParameters());
System.out.println(result.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
student,200001,ZhangSan,18,78
goodsPNH001011000200.1zhangshana2011/12/18 01:12:36
student,200002,LiSi,19,79
goodsPNH001022000300.1zhangshanb2011/12/19 01:12:36
student,200003,WangWu,20,80
goodsPNH001033000400.1zhangshanc2011/12/20 01:12:36
处理结果的学生信息文件如下:
200001 ZhangSan 1878
200002 LiSi 1979
200003 WangWu 2080
PNH00101,1000,200.1,zhangshana,Sun Dec 18 01:12:36 CST 2011
PNH00102,2000,300.1,zhangshanb,Mon Dec 19 01:12:36 CST 2011
PNH00103,3000,400.1,zhangshanc,Tue Dec 20 01:12:36 CST 2011