Spring Batch 简单应用 (三)(XML文件操作)

前篇关于Spring Batch的文章,讲述了Spring Batch 对CSV文件的读写操作。 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对XML文件的读写操作。实例流程是从一个XML文件中读取商品信息,经过简单的处理,写入另外一个XML文件中。

工程结构如下图:

log4j.xml是log处理的配置文件,与本文没有必然联系,再此不做论述。

application.xml文件内容如下:

按 Ctrl+C 复制代码

<?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.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-autowire="byName">

<!-- auto scan path -->
<context:component-scan base-package="com.wanggc.springbatch.sample.xml" />

<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">
</bean>
</beans>

按 Ctrl+C 复制代码

17行是base-spckage的指定,是spring的用法。

19-22行配置的jobLauncher用来启动Job。

24行配置的jobRepository为job提供持久化操作。

26-28行的transactionManager提供事物管理操作。

本文核心配置文件batch.xml内容如下:

按 Ctrl+C 复制代码

<?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.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.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">
</chunk>
</tasklet>
</step>
</job>

<!-- XML文件读取 -->
<bean:bean id="xmlReader"
class="org.springframework.batch.item.xml.StaxEventItemReader" scope="step">
<bean:property name="fragmentRootElementName" value="goods" />
<bean:property name="unmarshaller" ref="tradeMarshaller" />
<bean:property name="resource"
value="file:#{jobParameters[‘inputFilePath‘]}"></bean:property>
</bean:bean>

<!-- XML文件写入 -->
<bean:bean id="xmlWriter"
class="org.springframework.batch.item.xml.StaxEventItemWriter" scope="step">
<bean:property name="rootTagName" value="wanggc" />
<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="goods"
value="com.wanggc.springbatch.sample.xml.pojo.Goods" />
<bean:entry key="buyDay" value="java.util.Date"></bean:entry>
</util:map>
</bean:property>
</bean:bean>
</bean:beans>

按 Ctrl+C 复制代码

21-29行配置了Job的基本信息。此Job包含一个Step,Step中包含了基本的读(xmlReader),处理(xmlProcessor),写(xmlWriter)。

32-38行配置了对XML文件读操作。对XML的读是由SpringBatch提供的StaxEventItemReader类来完成。要读取一个XML文件,首先要知道这个文件的存放路径,resource属性就是指定文件路径信息的。知道了文件路径,还需要知道要读取的XML的根节点名称,fragmentRootElementName属性就是指定根节点名称的。知道了根节点名称,还需要知道的一点就是怎么解析这个节点信息,unmarshaller就负责完成解析节点信息,并映射成程序pojo对象。注意,根节点并不是指整个XML文件的根节点,而是指要读取的信息片段的根节点,不管这个节点片段处在哪一层,框架都会遍历到。

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

41-47行配置了对XML文件的写操作。与读XML文件一样,要写一个XML文件,也是需要知道这个文件的文件的存放路径的,同样是resource属性提供文件的路径信息。同时,也是需要知道这个文件的跟节点信息的,rootTagName属性提供根节点名信息。注意此处的根节点,指整个文件的跟节点,与读得时候稍有区别,从两个属性的名称上也可以看出。有了上面的信息,完成一个写操作,还需要一个把pojo对象转换成XML片段的工具,由marshaller提供。本文读操作的unmarshaller和写操作的marshaller用的是同一个转换器,因为XStreamMarshaller既提供将节点片段转换为pojo对象功能,同时又提供将pojo对象持久化为xml文件的功能。如果写的内容与读得内容有很大差异,可以另外配置一个转换器。

batch.xml文件配置的对XML文件的读写操作,至于读出来的信息做怎么样的处理再写入文件,通过简单的配置恐怕就无法完成了,就需要我们自己写代码完成了。XMLProcessor类就是完成这个工作的。只要在Job的配置文件中指定到这个类就可以了。XMLProcessor类的内容如下:

package com.wanggc.springbatch.sample.xml;

import java.util.Date;

import org.springframework.batch.item.ItemProcessor;import org.springframework.stereotype.Component;

import com.wanggc.springbatch.sample.xml.pojo.Goods;

/** * XML文件处理类。 */@Component("xmlProcessor")public class XMLProcessor implements ItemProcessor<Goods, Goods> {

/**     * XML文件内容处理。     *      */    @Override    public Goods process(Goods goods) throws Exception {        // 购入日期变更        goods.setBuyDay(new Date());        // 顾客信息变更        goods.setCustomer(goods.getCustomer() + "顾客!");        // ISIN变更        goods.setIsin(goods.getIsin() + "IsIn");        // 价格变更        goods.setPrice(goods.getPrice() + 1000.112);        // 数量变更        goods.setQuantity(goods.getQuantity() + 100);        // 处理后的数据返回        return goods;    }}

内容很简单,再此就不做赘述了。要注意的一点就是红背景色的地方。加了此标签无须在batch.xml文件增加对xmlProcessor声明用的bean,可以在job中直接引用,这是Spring的功能。当然,实现这个的前提是要在applicationContext.xml中配置base-package,只有这样才能找到。

工程结构图中的XMLLaunch类用来启动Job。内容如下:

package com.wanggc.springbatch.sample.xml;

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 XMLLaunch {

/**     * @param args     */    public static void main(String[] args1) {

ApplicationContext context = new ClassPathXmlApplicationContext(                "batch.xml");        JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");        Job job = (Job) context.getBean("xmlFileReadAndWriterJob");

try {            // JOB实行            JobExecution result = launcher.run(job, new JobParametersBuilder()                    .addString("inputFilePath", "C:\\input.xml")                    .addString("outputFilePath", "C:\\output.xml")                    .toJobParameters());            // 运行结果输出            System.out.println(result.toString());        } catch (Exception e) {            e.printStackTrace();        }    }}

注意其中为Job提供的两个动态参数,以及在配置文件中的用法。

pojo类Goods的内容如下:

package com.wanggc.springbatch.sample.xml.pojo;

import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;

/** * 商品信息类. */public class Goods {    /** isin号 */    private String isin;    /** 数量 */    private int quantity;    /** 价格 */    private double price;    /** 客户 */    private String customer;    /** 购入日期 */    private Date buyDay;
    /* getter he setter已经删除 */}

时间: 2024-10-23 02:39:16

Spring Batch 简单应用 (三)(XML文件操作)的相关文章

Spring Batch 简单应用(CSV文件操作)(二)

本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对CSV文件的读写操作.此实例的流程是:读取一个含有四个字段的CSV文件(ID,Name,Age,Score),对读取的字段做简单的处理,然后输出到另外一个CSV文件中. 工程结构如下图: JobLaunch类用来启动Job, CsvItemProcessor类用来对Reader取得的数据进行处理, Student类是一个POJO类,用来存放映射的数据. inputFile.csv是数据读取文件, outputFile.csv是

xml文件操作

一.xml文件操作1.了解xml文件的SAX解析方式 1.1SAX解析XML  //第一步:解析xml的对象  //工厂模式   SAXParser parser = SAXParserFactory       .newInstance()       .newSAXParser();  //第二步:获得xml文件   InputStream is = getResources().openRawResource(R.raw.shu);  //第三步: 处理器   DefaultHandler

Spring Batch学习笔记三:JobRepository

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch Job在运行时有很多元数据,这些元数据一般会被保存在内存或者数据库中,由于Spring Batch在默认配置是使用HSQLDB,也就是说在Job的运行过程中,所有的元数据都被储存在内存中,在Job结束后会随着进程的结束自动消失:在这里我们推荐配置JobRepository去使用MySQL. 在这种情况下,Spring Batch在单次执行或者从一个执行到另外一个执行的时候会使用数据库去维护状态,Job执行的信息包

python解析xml文件操作的例子

python解析xml文件操作实例,操作XML文件的常见技巧. xml文件内容: <?xml version="1.0" ?> <!--Simple xml document__chapter 8--> <book> <title> sample xml thing </title> <author> <name> <first> ma </first> <last>

Spring配置文件详解 – applicationContext.xml文件路径

Spring配置文件详解 – applicationContext.xml文件路径 Java编程 spring的配置文件applicationContext.xml的默认地址在WEB-INF下,只要在web.xml中加入代码 1 2 3 4 5 <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener&

linq to xml 简单的增、删、改、查、保存xml文件操作

using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using Syste

Spring Batch使用示例: 读取CSV文件并写入MySQL数据库

GitHub版本: https://github.com/kimmking/SpringBatchReferenceCN/blob/master/01_introduction/Spring_Batch_MySQL.md ------------ 编写批处理程序来处理GB级别数据量无疑是种海啸般难以面对的任务,但我们可以用Spring Batch将其拆解为小块小块的(chunk). Spring Batch 是Spring框架的一个模块,专门设计来对各种类型的文件进行批量处理. 本文先讲解一个简

Spring Batch 简单应用 (一)(Hello World)

通过前面两篇关于Spring Batch文章的介绍,大家应该已经对Spring Batch有个初步的概念了.这篇文章,将通过一个"Hello World!"实例,和大家一起探讨关于Spring Batch的一些基本配置和实现.使大家从开发的角度对Spring Batch有一个真切的体会. 说明:1,本实例使用的是spring-batch 2.1.8 2,本实例没有像前面讲的那样配置ItemReader.ItemProcessor和ItemWriter,而是之间在Step中调用Taskl

VS之XML文件操作

XML,可扩展的标识语言(eXtensible Markup Language),具有多种优势,所以现在被广泛使用,本文通过一个简单的例子来实现对XML文件的保存和读取操作. 使用工具:VS2008 使用语言:C++ 开发步骤: 1.新建对话框程序 2.添加XML相关类 该类摘自网络 Markup.h // Markup.h: interface for the CMarkup class. // // Markup Release 8.2 // Copyright (C) 1999-2006