Spirng_Batch
一、需求分析
使用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的更多相关文章
随机推荐
- PHP实现分页:文本分页和数字分页
来源:http://www.ido321.com/1086.html 最近,在项目中要用到分页.分页功能是经常使用的一个功能,所以,对其以函数形式进行了封装. // 分页分装 /** * $pageT ...
- mysql怎么让一个存储过程定时执行
比如说每天的12:30执行 查看event是否开启: show variables like '%sche%'; 将事件计划开启: set global event_scheduler=1; 关闭事件 ...
- C++多态分析(polymorphisn)
前言 借着这次学校的生产实习来回顾下C++的多态,这里讨论下C++的多态以及实现原理.我都是在QT下使用C++的,就直接在QT下进行演示了 多态介绍 面向对象语言中最核心的几个理念就是:封装.继承.多 ...
- angularjs ng-class 两种用法
ng-class="{'active':current.actived_tree==item}" ng-class="{true:'label-danger white- ...
- Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期
servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...
- ocp 1Z0-047 1-60题解析
1. You need to load information about new customers from the NEW_CUST table into the tables CUST and ...
- Spring EL hello world example
The Spring EL is similar with OGNL and JSF EL, and evaluated or executed during the bean creation ti ...
- javascript中数组的迭代等操作
- Chapter 8. Classes
8.1. Class Declarations 8.1.1. Class Modifiers 8.1.1.1. abstract Classes 8.1.1.2. final Classes 8.1. ...
- 439. Segment Tree Build II
最后更新 08-Jan-2017 开始介绍线段树的主要作用了,可以快速在区间查找极值,我猜是这样的..... 一个NODE的最大值取决于它左边和右边最大值里大 按个,所以,所以什么?对了,我们该用po ...