- 浏览: 166181 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (95)
- oracle (7)
- java 基础 (10)
- web层 (3)
- 框架技术 (0)
- eclipse技巧 (2)
- 重构 (2)
- 架构 (1)
- 缓存 (11)
- 分布式多线程编程 (5)
- jquery (8)
- ibatis (3)
- spring API (1)
- maven (1)
- spring (4)
- js (12)
- 正则表达式 (1)
- Velocit (1)
- 杂七杂八 (3)
- XSS跨域攻击 (1)
- appfuse (2)
- Simple-Spring-Memcached (3)
- spring batch (11)
- spring integration (2)
- Teiid 8.0 (0)
- Linux 命令 (1)
最新评论
-
luxianping:
怎么根据命名空间来删除缓存? 比如说用户对应的菜单,当有用户 ...
使用SSM注解做缓存操作 -
vemacitri_b:
mowengaobo 写道你可以这样理解key。为什么不单独放 ...
使用SSM注解做缓存操作 -
mowengaobo:
你可以这样理解key。为什么不单独放个参数出来如 @Rea ...
使用SSM注解做缓存操作 -
夜神月:
目前我在dao曾有如下的注解配置:@ReadThroughSi ...
使用SSM注解做缓存操作
前面关于Spring Batch的文章,讲述了SpringBatch对CSV文件的读写操作、对XML文件的操作,以及对固定长格式文件的操作。这些事例,同一个Reader读取的都是相同格式的数据,最终写入一个文件。如果遇到下面这样的数据,并想将学生信息和商品信息分类后写入两个文件,应该如何处理呢?
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
* 以student开头的数据代表学生信息,以goods开头代表商品信息
这次将和大家一起探讨Spring Batch读取复合格式的数据,然后写入不同的文件的处理方式。
工程结构如下图:
applicationContext.xml和log4j.xml前文已经叙述过,在此不做赘述。
本实例的核心配置文件batch.mxl内容如下:
<?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的配置信息 --> <job id="multiTypeSingleFileJob"> <step id="xmlFileReadAndWriterStep"> <tasklet> <chunk reader="multiTypesItemReader" writer="multiTypesItemWriter" commit-interval="1"> <streams> <stream ref="studentWriter" /> <stream ref="goodsWriter" /> </streams> </chunk> </tasklet> </step> </job> <!-- 不同格式数据的文件读取 --> <bean:bean id="multiTypesItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> <bean:property name="resource" value="file:#{jobParameters['inputFilePath']}" /> <bean:property name="lineMapper"> <bean:bean class="org.springframework.batch.item.file.mapping.PatternMatchingCompositeLineMapper"> <bean:property name="tokenizers"> <bean:map> <bean:entry key="student*" value-ref="studentTokenizer" /> <bean:entry key="goods*" value-ref="goodsTokenizer" /> </bean:map> </bean:property> <bean:property name="fieldSetMappers"> <bean:map> <bean:entry key="student*" value-ref="studentFieldSetMapper" /> <bean:entry key="goods*" value-ref="goodsFieldSetMapper" /> </bean:map> </bean:property> </bean:bean> </bean:property> </bean:bean> <bean:bean id="studentTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> <bean:property name="delimiter" value="," /> <bean:property name="names"> <bean:list> <bean:value>student</bean:value> <bean:value>ID</bean:value> <bean:value>name</bean:value> <bean:value>age</bean:value> <bean:value>score</bean:value> </bean:list> </bean:property> </bean:bean> <bean:bean id="studentFieldSetMapper" class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> <bean:property name="prototypeBeanName" value="student" /> <bean:property name="distanceLimit" value="100" /> </bean:bean> <!-- 学生Pojo类 --> <bean:bean id="student" class="com.wanggc.springbatch.sample.multitypessinglefile.pojo.Student" scope="prototype" /> <bean:bean id="goodsTokenizer" class="org.springframework.batch.item.file.transform.FixedLengthTokenizer"> <bean:property name="columns" value="6-13,14-17,18-22,23-32,33-" /> <bean:property name="names" value="isin,quantity,price,customer,buyDay" /> </bean:bean> <bean:bean id="goodsFieldSetMapper" class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> <bean:property name="prototypeBeanName" value="goods" /> </bean:bean> <!-- 商品Pojo类 --> <bean:bean id="goods" class="com.wanggc.springbatch.sample.multitypessinglefile.pojo.Goods" scope="prototype" /> <bean:bean id="multiTypesItemWriter" class="com.wanggc.springbatch.sample.multitypessinglefile.MultiItemWriter"> <bean:property name="delegates"> <bean:list> <bean:ref bean="studentWriter" /> <bean:ref bean="goodsWriter" /> </bean:list> </bean:property> </bean:bean> <!-- 学生信息的写 --> <bean:bean id="studentWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step"> <bean:property name="resource" value="file:#{jobParameters['outputFilePathStudent']}" /> <bean:property name="lineAggregator"> <bean:bean class="org.springframework.batch.item.file.transform.FormatterLineAggregator"> <bean:property name="fieldExtractor"> <bean:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> <bean:property name="names" value="ID,name,age,score" /> </bean:bean> </bean:property> <bean:property name="format" value="%-9s%-9s%3d%-2.0f" /> </bean:bean> </bean:property> </bean:bean> <!-- 商品信息的写 --> <bean:bean id="goodsWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step"> <bean:property name="resource" value="file:#{jobParameters['outputFilePathGoods']}" /> <bean:property name="lineAggregator"> <bean:bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> <bean:property name="fieldExtractor"> <bean:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> <bean:property name="names" value="isin,quantity,price,customer,buyDay" /> </bean:bean> </bean:property> </bean:bean> </bean:property> </bean:bean> </bean:beans>
21-33行配置了Job的基本信息。
36-57行配置了Reader的基本信息。FlatFileItemReader的lineMapper属性使用SpringBatch核心类PatternMatchingCompositeLineMapper的时候,会将读取的记录按照不同的方式映射成我们的Pojo对象。当然首先我们要配置不同的tokenizers(43-48)和fieldSetMappers(49-54),并告诉它当前的记录按照那条原则去解析和映射。如45行所示,我们指定key为student*的时候,用studentTokenizer去解析成fieldset,用studentFieldSetMapper将studentTokenizer解析好的fieldset记录映射成Student对象。我们指定的key,其实也就是student开头的记录,*是通配符。PatternMatchingCompositeLineMapper支持两种通配符:*和?,前者代表多个字符,后者仅代表一个字符。至于student和goods信息如何映射成pojo对象,前面的文章中已经做过详细的介绍,这里就不做赘述了。 96-104行配置了Writer的基本信息。Writer也是使用代理的方式,学生信息使用106-122行定义的studentWriter按照固定长的格式写入学生信息文件中,商品信息使用124-141行定义的goodsWriter按照CSV的格式写入商品信息文件中。MultiItemWriter的代码很简单,就不做详细解释了。如下: 至此,复合文件的读写操作已经讨论结束了。注意实例没有配置Processor。下面是一些辅助文件的信息。 student和goods类的信息与前面文章一样,就不再贴出代码了。 Job启动的代码如下: Input文件内容如下图: 处理结果的学生信息文件如下图: 处理结果的商品信息文件如下图: Spring Batch对复合格式文件的读写操作就讨论到这里。至此,Spring Batch对文件简单操作的讨论也告一段落,下次将讨论Spring Batch读写DB的操作。package com.wanggc.springbatch.sample.multitypessinglefile;
import java.util.ArrayList;
import java.util.List;
import org.springframework.batch.item.ItemWriter;
import com.wanggc.springbatch.sample.multitypessinglefile.pojo.Goods;
import com.wanggc.springbatch.sample.multitypessinglefile.pojo.Student;
/**
* 写处理类。
*
* @author Wanggc
*
* @param <T>
*/
@SuppressWarnings("unchecked")
public class MultiItemWriter<T> implements ItemWriter<T> {
/** 写代理 */
private List<ItemWriter<? super T>> delegates;
public void setDelegates(List<ItemWriter<? super T>> delegates) {
this.delegates = delegates;
}
@Override
public void write(List<? extends T> items) throws Exception {
// 学生信息的Writer
ItemWriter studentWriter = (ItemWriter) delegates.get(0);
// 商品信息的Writer
ItemWriter goodsWriter = (ItemWriter) delegates.get(1);
// 学生信息
List<Student> studentList = new ArrayList<Student>();
// 商品信息
List<Goods> goodsList = new ArrayList<Goods>();
// 将传过来的信息按照不同的类型添加到不同的List中
for (int i = 0; i < items.size(); i++) {
if ("Student".equals(items.get(i).getClass().getSimpleName())) {
studentList.add((Student) items.get(i));
} else {
goodsList.add((Goods) items.get(i));
}
}
// 如果学生List中有数据,就执行学生信息的写
if (studentList.size() > 0) {
studentWriter.write(studentList);
}
// 如果商品List中有数据,就执行商品信息的写
if (goodsList.size() > 0) {
goodsWriter.write(goodsList);
}
}
}package com.wanggc.springbatch.sample.multitypessinglefile;
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 {
// JOB实行
JobExecution result = launcher.run(
job,
new JobParametersBuilder()
.addString("inputFilePath",
"C:\\testData\\multiTypesInput.txt")
.addString("outputFilePathStudent",
"C:\\testData\\student.txt")
.addString("outputFilePathGoods",
"C:\\testData\\goods.csv")
.toJobParameters());
// 运行结果输出
System.out.println(result.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
发表评论
-
Spring Batch(一)
2012-05-15 17:38 1410最近因为工作需要抽空学习了一下Spring Batch ... -
Spring Batch 之 JobParameters (十)
2012-05-14 16:30 2709继续前面关于Spring Batch系列的文章,本文 ... -
Spring Batch 之 skip讲解(九)
2012-05-14 16:29 1676前面的文章跟大家一起讨论了Spring Batch的概念, ... -
Spring Batch 之 Sample(游标方式读写DB数据表)(八)
2012-05-14 16:26 1804前面关于Spring Batch的文章,讲述了 ... -
Spring Batch 之 Sample(固定长格式文件读写)(六)
2012-05-14 16:23 2626前篇关于Spring Batch的文章,讲 ... -
Spring Batch 之 Sample(XML文件操作)(五)
2012-05-10 15:11 1362Spring Batch 之 Sample(XML文件 ... -
Spring Batch 之 Sample(CSV文件操作)(四)
2012-05-10 15:10 1751Spring Batch 之 Sample(C ... -
Spring Batch 之 Sample(Hello World)(三)
2012-05-10 15:07 1180通过前面两篇关于Spring Batch文 ... -
Spring Batch 之 框架流程简单介绍(二)
2012-05-10 15:06 1195Spring Batch流程介绍: 上图描绘了Spr ... -
Spring Batch 之 Spring Batch 简介(一)
2012-05-10 15:05 1368Spring Batch 之 Spring Batch 简 ...
相关推荐
在本教程中,我们将探讨如何使用 Spring Batch 读取文本(txt)文件,并将读取到的数据处理后写入数据库。 首先,我们需要创建一个 Maven 项目,并在 `pom.xml` 文件中添加必要的依赖。这些依赖包括 `spring-boot-...
在 `springBatchDemo` 文件中,通常包含了示例代码,演示如何配置和运行一个简单的Spring Batch作业,涉及到读取数据库中的数据,进行处理,然后写回到数据库。你可以参考这些代码,理解Spring Batch的工作原理和...
在这个提供的压缩包文件中,名为"batch"的文件可能包含了一个简单的Spring Boot和Spring Batch整合的示例项目。这些文件可能包括Java源代码、配置文件以及可能的测试用例。通过查看这些文件,你可以学习如何将批处理...
Spring Batch是一个轻量级的,完全面向Spring的批处理框架,可以应用于企业级大量的数据处理系统。Spring Batch以POJO和大家熟知的Spring框架为基础,使开发者更容易的访问和利用企业级服务。Spring Batch可以提供...
Spring Batch提供了多种内置的ItemReader和ItemWriter实现,支持从数据库、文件等多种数据源读取数据,以及将数据写入到数据库、文件等目的地。 知识点五:数据处理 在数据被读取之后,通常需要经过一定的处理才能...
在Spring Batch中,分区处理是一种优化策略,它将大型工作负载分解成多个较小、独立的任务,这些任务可以在不同的线程或甚至不同的节点上并行运行,从而提高处理速度。在本示例中,我们将深入探讨"spring-batch 分区...
在"SpringBatch的简单Sample"中,我们将探讨两种主要的处理模式:Tasklet和Chunk。 1. **Tasklet**: Tasklet 是SpringBatch中的基本执行单元,它可以被视为一个独立的任务。Tasklet 不是基于数据集的,而是执行一...
Spring Batch提供了强大的读取器和写入器实现,这些实现支持多种数据源和格式,包括关系型数据库、文件系统和消息队列等。读取器通过ItemReader接口读取数据项,写入器通过ItemWriter接口将处理后的数据写入目标系统...
Spring Batch的事务管理是其核心特性之一。Spring Batch要求每个步骤都运行在一个事务上下文中。事务保证了步骤中进行的操作要么全部成功,要么全部回滚,这为批处理作业提供了数据一致性和完整性保障。 4. 错误...
**Spring Batch 深度解析** Spring Batch 是一个强大的、全面的批处理框架,由 Spring 社区开发,旨在简化企业级应用中的批量数据处理任务。这个框架提供了一种标准的方式来处理大量的数据输入和输出,使得开发者...
Spring Batch可以通过配置文件或编程方式定义批处理作业的步骤和流程。 动态集群是指能够在运行时动态添加或移除服务器节点的集群环境。在Quartz中实现动态集群,主要是通过共享JobStore实现的,例如使用...
在压缩包文件 `spring-batch-4.0.0.M5` 中,包含了 Spring Batch 4.0.0 版本的预发布版本。这个版本可能包含了一些实验性的特性和改进,用于测试和反馈,以便在正式版中进行完善。 总的来说,Spring Batch 4.0.0 为...
### 基于Spring Batch的大数据量并行处理 #### 概述 Spring Batch是一款用于高效处理大量数据的开源框架,特别适用于批处理任务。它由Spring Source与Accenture合作开发,结合了双方在批处理架构和技术上的优势,...
SpringBoot和SpringBatch是两个非常重要的Java开发框架,它们在企业级应用开发中扮演着重要角色。SpringBoot简化了Spring应用程序的配置和启动过程,而SpringBatch则专注于批处理任务,提供了一套全面且可扩展的解决...
在这个名为 "Spring Batch sample project PatternMatchingCompositeLineMapper" 的示例项目中,我们聚焦于如何利用 `PatternMatchingCompositeLineMapper` 和 `MatchingClassLineAggregator` 这两个关键组件来优化...
Spring Batch 是一个强大的开源批处理框架,用于处理大量数据,尤其在企业级应用中广泛应用。它为批量处理任务提供了全面的解决方案,包括读取、处理和写入数据,以及事务管理、错误处理和作业调度。"Pro Spring ...
SpringBatch Tasklet sample
- **Job**:在 Spring Batch 中,一个 Job 表示一个完整的批处理任务,它可以包含多个步骤(Steps)。 - **Step**:Step 是 Job 的组成部分之一,代表了一个具体的处理过程。每个 Step 可能包括读取数据、处理数据...
SpringBatch 是一个强大的Java批处理框架,由Spring社区开发并维护,主要用于处理大量数据的后台操作,如批量导入导出、日志分析、定时任务等。在本文中,我们将深入探讨SpringBatch的学习入门,以及如何在IDEA环境...
Spring Batch API(Spring Batch 开发文档).CHM。 官网 Spring Batch API,Spring Batch 开发文档