`
mowengaobo
  • 浏览: 166690 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring Batch 之 Sample(XML文件操作)(五)

 
阅读更多

Spring Batch 之 Sample(XML文件操作)(五)

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

     工程结构如下图:

                       

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

     application.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.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>
 

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

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

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

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

     本文核心配置文件batch.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.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>
 

     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已经删除 */
}
复制代码

     input.xml文件内容如下:

     处理结果如下(output.xml):

     下次,将和大家一起讨论关于Spring Batch 对固定长内容文件的读写问题。

 

分享到:
评论

相关推荐

    SpringBatch的简单Sample

    在"SpringBatch的简单Sample"中,我们将探讨两种主要的处理模式:Tasklet和Chunk。 1. **Tasklet**: Tasklet 是SpringBatch中的基本执行单元,它可以被视为一个独立的任务。Tasklet 不是基于数据集的,而是执行一...

    Spring Batch sample project PatternMatchingCompositeLineMapper

    在这个名为 "Spring Batch sample project PatternMatchingCompositeLineMapper" 的示例项目中,我们聚焦于如何利用 `PatternMatchingCompositeLineMapper` 和 `MatchingClassLineAggregator` 这两个关键组件来优化...

    Spring Batch 实例代码

    3. **Tasklet**: Tasklet 是Spring Batch中最基本的工作单元,它定义了批处理任务中的一个独立操作。Tasklet不关心数据的分块处理,但可以被Step多次调用。如果一个Tasklet实现`Repeatable`接口,那么Step会根据需要...

    Spring中的sample

    9. **Spring Batch**:用于处理批量数据操作,支持读取、处理、写入等步骤,适合大数据量处理场景。 10. **Spring Security**:提供了全面的安全管理解决方案,包括认证、授权、CSRF防护等,可以保护Web应用的安全...

    Spring-batch Demo.zip

    Spring Batch 提供了多种类型的读取器和写入器,如FlatFileItemReader和FlatFileItemWriter用于处理文本文件,JdbcPagingItemReader和JdbcBatchItemWriter用于数据库操作。此外,还可以自定义处理器和存储器来适应...

    SpringBatchSample:Spring Batch 示例 4 书

    例如,XML配置文件(如batch-config.xml)展示了如何定义Job和Step,以及如何装配Bean来处理特定的批处理任务。此外,还可能包含自定义ItemReader、ItemProcessor和ItemWriter的实现,这些都是Spring Batch处理数据...

    spring-boot-sample-batch

    只需在`pom.xml`文件中添加相应的依赖,Spring Boot会自动配置Spring Batch的核心组件。 4. **批处理作业(Job)和步骤(Step)** 在Spring Batch中,批处理任务由一个或多个步骤组成。每个步骤通常包括读取数据、...

    spring-batch-sample

    以顺序或并行模式批处理文件的示例。 用 : mvn clean install# launch sequential versionjava -jar SpringBatchSample.jar sequential-context.xml printJob# launch parallel versionjava -jar SpringBatchSample...

    Spring与Mybatis整合

    【Spring与Mybatis整合】是将Spring框架与Mybatis数据持久层框架集成的过程,以便更好地管理数据库操作。在Spring 3.1版本时,官方并未直接提供与Mybatis的集成支持,但社区开发了一个中间件使得整合变得可能。以下...

    Spring-Batch-Mongo-Sample:使用MongoDB测试弹簧批处理功能的示例应用程序

    用于触发批处理作业,现在它从mongodb中读取数据并将其保存到xml文件中其他端点:(Mongo凝乳操作) / save ---&gt;将文件保存到测试数据库中的报告集合/ getall ---&gt;获取json字符串中的所有文档/ deleteall ---&...

    spring-sample

    4. **数据访问集成**:Spring支持多种数据存取技术,包括JDBC、ORM(Hibernate、MyBatis等)和OXM(Object-XML Mapping),简化了数据库操作。 5. **事务管理**:Spring提供了声明式和编程式事务管理,使得处理事务...

    spring-study-sample-code:一个项目跟随了这个

    9. **Spring Batch**:用于处理批量操作的框架,如大量数据的导入导出、定期任务等。 10. **测试支持**:Spring提供了JUnit和Mockito等工具的集成,方便编写单元测试和集成测试。 这个"spring-study-sample-code...

    javathinking-sample2-type1-batch

    【文件名称列表】"javathinking-sample2-type1-batch-master"看起来是Git仓库的主分支名称,通常包含项目源代码、配置文件、测试用例等。在实际项目中,我们可能会找到如下的文件和目录结构: 1. `src/main/java`: ...

    Spring启动批次样本

    在`spring-boot-batch-sample-master`项目中,我们可以看到以下依赖: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-batch ``` 接下来,我们需要定义批处理作业(Job)和步骤...

    springboot-sample:要使用的一些示例

    6. **弹簧靴批**:这可能是对“Spring Boot Batch”的误写,Spring Boot Batch是Spring Boot的一部分,提供了一套全面的批处理应用程序框架。它可以用于执行大量的重复操作,如导入导出数据、数据清洗和转换等。 7....

    Hibernate使用技巧汇总

    - 在Spring配置文件中可以移植整个`hibernate.cfg.xml`的内容,便于集中管理和配置。 以上内容总结了Hibernate使用过程中的一些重要技巧和注意事项,包括配置文件的选择与使用、实体关系管理、延迟加载策略以及与...

    MetaDataSpr-开源

    在提供的压缩包中,`sample-batch-start.bat`和`sample-gui-start.bat`很可能是启动脚本,分别用于批处理模式和图形用户界面模式运行MetaDataSpr。这表明项目不仅提供了命令行接口,还提供了直观的图形界面,以适应...

Global site tag (gtag.js) - Google Analytics