一、需求分析

使用Spring Batch对XML文件进行读写操作: 从一个xml文件中读取商品信息, 经过简单的处理, 写入另外一个xml文件中.

二、代码实现

1. 代码结构图:

2. applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd"
default-autowire="byName"> <!-- auto scan path -->
<context:component-scan base-package="com.zdp" /> <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" />
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
</beans>

base-package: 扫描spring注解

jobLauncher: 启动Job

jobRepository: 为Job提供持久化操作

transactionManager: 提供事务管理操作

3. springBatch.xml

<?xml version="1.0" encoding="UTF-8"?>
<bean:beans xmlns="http://www.springframework.org/schema/batch"
xmlns:bean="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd"> <bean:import resource="applicationContext.xml" /> <job id="xmlFileReadAndWriterJob">
<step id="xmlFileReadAndWriterStep">
<tasklet>
<chunk reader="xmlReader" writer="xmlWriter" processor="xmlProcessor" commit-interval="10" />
</tasklet>
</step>
</job> <!-- XML文件读取 -->
<bean:bean id="xmlReader" class="org.springframework.batch.item.xml.StaxEventItemReader" scope="step">
<bean:property name="fragmentRootElementName" value="product" />
<bean:property name="unmarshaller" ref="tradeMarshaller" />
<bean:property name="resource" value="file:#{jobParameters['inputFilePath']}" />
</bean:bean> <!-- XML文件写入 -->
<bean:bean id="xmlWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter" scope="step">
<bean:property name="rootTagName" value="zdp" />
<bean:property name="marshaller" ref="tradeMarshaller" />
<bean:property name="resource" value="file:#{jobParameters['outputFilePath']}" />
</bean:bean> <bean:bean id="tradeMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
<bean:property name="aliases">
<util:map id="aliases">
<bean:entry key="product" value="com.zdp.domain.Product" />
<bean:entry key="buyDate" value="java.util.Date" />
</util:map>
</bean:property>
</bean:bean>
</bean:beans>

1. Job包含一个Step,Step中包含了基本的读(xmlReader),处理(xmlProcessor),写(xmlWriter)。

2. xmlReader配置了xml读操作, resource属性是指定文件路径信息的。知道了文件路径 。 fragmentRootElementName属性是指定根节点名称的.  unmarshaller负责完成解析节点信息,并映射成程序pojo对象。

3. tradeMarshaller为解析xml节点, 其中entry的key指定对应根节点名称product,value指定程序的pojo类,这样,程序就可以将product节点下的子节点与pojo类(P roduct )中的属性去匹配,当匹配到子节点名与pojo类中的属性名相同时,就会将子节点的内容赋值给pojo类的属性。这样就完成了一个根节点的读取,框架会控制循环操作,直到将文件中所有根( product )节点全部读完为止。这样就完成了XML文件的读操作。

4. xmlWriter配置了对XML文件的写操作。resource属性提供文件的路径信息。同时,也是需要知道这个文件的跟节点信息的,rootTagName属性提供根节点名信息。marshaller 把pojo对象转换成XML片段的工具。本文读操作的unmarshaller和写操作的marshaller用的是同一个转换器,因为XStreamMarshaller既提供将节点片段转换为pojo对象功能,同时又提供将pojo对象持久化为xml文件的功能。

4. XMLProcessor

/**
* XML文件处理类。
*/
@Component("xmlProcessor")
public class XMLProcessor implements ItemProcessor<Product, Product> {
// XML文件内容处理
@Override
public Product process(Product product) throws Exception {
product.setBuyDate(new Date());
product.setCustomer(product.getCustomer() + "顾客!");
product.setId(product.getId() + "_1");
product.setPrice(product.getPrice() + 1000.0);
product.setQuantity(product.getQuantity() + 100);
return product;
}
}

5. Product

/**
* 实体产品类
*/
public class Product {
private String id;
private int quantity; // 数量
private double price; // 价格
private String customer; // 顾客
private Date buyDate; // 日期
}

6. JobLaunch

/**
* Test client
*/
public class JobLaunch { public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("springBatch.xml");
JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean("xmlFileReadAndWriterJob");
try {
jobLauncher.run(job, new JobParametersBuilder().addString("inputFilePath", "d:\\input.xml")
.addString("outputFilePath", "d:\\output.xml")
.toJobParameters());
} catch (Exception e) {
e.printStackTrace();
}
}
}

7. input.xml

8.  output.xml

http://www.tuicool.com/articles/NNZbYv3

http://www.dineshonjava.com/2014/03/spring-batch-xml-to-mongodb-database.html http://stackoverflow.com/questions/26462952/how-to-extract-data-from-multiple-xml-files-and-put-it-in-one-xml-file-in-spring?rq=1 http://www.dineshonjava.com/2014/03/spring-batch-xml-to-mongodb-database.html

mutiple: http://www.dineshonjava.com/2014/03/multiresourceitemreader-in-spring-batch.html

override reader http://stackoverflow.com/questions/17448541/multiresourceitemreader-with-a-custom-delegate-keeps-reading-the-same-file

Spirng_Batch的更多相关文章

随机推荐

  1. ASP.NET 中JSON 的序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...

  2. 一个【wchar_t】引发的学案

    今天在查cout  wcout区别的时候,看到一篇博客(http://blog.csdn.net/hikaliv/article/details/4570956) 里面讲到了wchar_t ----- ...

  3. C++实现离散余弦变换(参数为二维指针)

    C++实现离散余弦变换(参数为二维指针) 写在前面 到目前为止已经阅读了相当一部分的网格水印等方面的论文了,但是论文的实现进度还没有更上,这个月准备挑选一些较为经典的论文,将其中的算法实现.在实现论文 ...

  4. 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence

    // 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence // 题意:三种操作,1增加值,2开根,3求和 // 思路:这题与HDU 4027 和HDU 5634 ...

  5. 使用matplotlib绘制带图例的图表

    #coding=utf8 from pylab import * plt.figure(figsize=(8,10), dpi=50) plt.plot(do_tow2[28:508],do_prn2 ...

  6. linux 配置免密码登录

    主要就是两步 : 1. scp ~/.ssh/id_rsa.pub root@远程ip地址:~/ 2. cat id_rsa.pub >> ~/.ssh/authorized_keys,把 ...

  7. 多线程之 CountDownLatch

    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. CountDownLatch如其所写,是一个倒计数的锁存器,当计数减至0时触发特定 ...

  8. hadoop测试环境主配置简例

    1,mapred-site.xml 此配置文件主要是针对mapreduce的配置文件,配置的是jobtracker的地址和端口; <configuration> <property& ...

  9. TreeMap实现原理

    摘要 研究项目底层代码时,发现项目中的数据的缓存用的是TreeMap来实现对数据的缓存管理.本片博文就TreeMap的源码.原理以及用法做一个探究 在用TreeMap之前我们要对TreeMap有个整体 ...

  10. Linux里实用命令之添加行号、文本和语法高亮显示

    写在前面的话 本博主我,强烈建议,来看此博文的朋友们,都玩玩. 最好,在刚入门的时候呢,不加行号,不玩文本和语法高亮显示,以后会深有体会.磨炼自己! 步骤一:进入 /etc/virc配置文件 步骤二: ...