跑批利器--读取文件
在上篇文章中已经对示例的基本业务和流程进行了解,同时也知道了SpringBatch的三个接口ItemReader,ItemProcessor,ItemWriter.接下来我们主要是通过示例来具体处理一个文本文件,将里面的数据和内容通过SpringBatch的加工处理来存到新的数据库中.
SpringBatch提供专门的类去读取文本文件:FlatFileItemReader.要用这个类的话我们需要配置一个Spring的bean并实现一个组件用来创建领域对象.剩下的就交给SpringBatch,我们不需要再关注关于I/O具体的处理实现.
下面是一个富文本文件的例子,通常都是有一行一行的数据构成
PRODUCT_ID,NAME,DESCRIPTION,PRICE
PR....210,BlackBerry8100 Pearl,A cell phone,124.60
PR....211,SonyEricsson W810i,Yet another cell phone!,139.45
PR....212,SamsungMM-A900M Ace,A cell phone,97.80
PR....213,ToshibaM285-E 14,A cell phone,166.20
PR....214,Nokia2610 Phone,A cell phone,145.50
接下来我们还要有对应每个记录的产品实体类,一个实例代表着一条记录.如下:
importjava.math.BigDecimal;
publicclass Product {
privateString id;
privateString name;
privateString description;
privateBigDecimal price;
(...)
}
然后我们通过FlatFileItemReader类来 创建一个产品对象从产品文件中.它基本上提供了所有的I/O操作,例如打开一个文件,通过流来一行行的读取,随后再关掉这个文件.LineMapper是实现一行行的产品记录转换成一个个对象的桥梁,SpringBatch提供了一个LineMapper的实现类:DefaultLineMapper.如下图:
我们可以通过FieldSetMapper将一行行的产品记录通过LineTokenizer来进行分割并转换成一个java对象,FieldSetMapper接口如下:
publicinterface FieldSetMapper<T> {
TmapFieldSet(FieldSet fieldSet) throws BindException;
}
FieldSet的参数来自于LineTokenizer,可以把它当做一个jdbc的结果集,下面的代码片段示例ProductFieldSetMapper的实现
importorg.springframework.batch.item.file.mapping.FieldSetMapper;
importorg.springframework.batch.item.file.transform.FieldSet;
importorg.springframework.validation.BindException;
importcom..domain.Product;
publicclass ProductFieldSetMapper implements FieldSetMapper<Product> {
publicProduct mapFieldSet(FieldSet fieldSet) throws BindException {
Productproduct = new Product();
product.setId(fieldSet.readString("PRODUCT_ID"));
product.setName(fieldSet.readString("NAME"));
product.setDescription(fieldSet.readString("DESCRIPTION"));
product.setPrice(fieldSet.readBigDecimal("PRICE"));
returnproduct;
}
}
从上述的代码片段中我们可以看到它主要的工作是将文本文件里的记录转换成一个product对象,仔细看参数里的字符串,PRODUCT_ID,
NAME,DESCRIPTION,PRICE等,这些是从哪里来的?它们是LineTokenizer的配置里的内容,接下来我们再研究如何配置FlatFileItemReader在Spring容器里.
<beanid="reader"class="org.springframework.batch.item.file.FlatFileItemReader">
<propertyname="resource" value="file:./work/output/output.txt" />
<propertyname="linesToSkip" value="1" />
<propertyname="lineMapper">
<beanclass="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<propertyname="lineTokenizer">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<propertyname="names" value="PRODUCT_ID,
NAME,DESCRIPTION,PRICE" />
</bean>
</property>
<propertyname="fieldSetMapper">
<beanclass="com.manning.sbia.ch01.batch.ProductFieldSetMapper" />
</property>
</bean>
</property>
</bean>
上面的资源属性文件定义了文件的读取,因为第一行的内容包括头,所以我们通过lineToSkip属性告诉SpringBatch跳过第一行的内容不处理.通过DelimitedLineTokenizer将一行行的记录字段通过逗号分隔符分开.然后我们给每个字段都定义了对应的名字,这些名字就是要在ProductFieldSetMapper类中用到的FieldSet.最终达到了我们想要的效果.
跑批利器--读取文件相关推荐
- 跑批利器--SpringBatch框架
Spring Batch的框架包括启动批处理作业的组件和存储Job执行产生的元数据.如果你作为一个批处理应用程序的开发人员,你暂时没有必要跟这些组件打交道,因为它们主要为我们提供组件支持的角色,但是您 ...
- 学习笔记-如何设计离线跑批系统
一.基本概念 离线跑批:通常指批量加工数据.完成一系列流程的定时任务. 业务场景:在银行.金融.支付出现较多,其他行业也可能涉及. 1. 定时的数据状态更新(到期失效) 2. 数据计算(计算罚息.计提 ...
- 批量-跑批存在的意义
批量,顾名思义,一批一批的数据,数据量多.为什么有批量,有跑批这种操作呢? 一个系统,大多数系统肯定不是独立存在,肯定存在系统与系统之间的交互,数据的交换,调接口,取别人系统的数据等.而且就算是一个独 ...
- windows下python使用fllow扩展持续读取文件的bug
文章目录 一.前言 二.读取fllow源码 1.fllow读取文件代码 2.跟踪new_file_check 函数 3.python的stat函数 4.分析出错代码 三.windows下对比inode ...
- java跑批任务_【spring配置】——spring整合Quartz定时器
第一种:为普通java类中的某个方法配置跑批任务MethodInvokingJobDetailFactoryBean CronTriggerBean SchedulerFactoryBean 1.定义 ...
- 读取文件时,程序经历了什么?
来源 | 码农的荒岛求生(ID:escape-it) 你有没有想过当我们执行I/O操作时计算机底层都发生了些什么? 在回答这个问题之前,我们先来看下为什么对于计算机来说I/O是极其重要的. 不能执行I ...
- python 读取文件到字典读取顺序_Python用list或dict字段模式读取文件的方法
前言 Python用于处理文本数据绝对是个利器,极为简单的读取.分割.过滤.转换支持,使得开发者不需要考虑繁杂的流文件处理过程(相对于JAVA来说的,嘻嘻).博主自己工作中,一些复杂的文本数据处理计算 ...
- 微服务设计指导-使用云原生微服务解决传统海量跑批时引起的系统间“级联雪崩”以及效率
问题描述 这也是一起真实的生产事故,如下图所示 这种"雪崩"是属于企业内部系统雪崩. 我们都知道如果是在外部http (包括一切restful.soap请求.http类型调用)调用 ...
- 【中亦安图】清算/报表/日终跑批程序之性能优化案例(5)
第一章 技术人生系列 · 我和数据中心的故事(第五期)-清算/报表/日终跑批程序之性能优化案例(一) 中亦安图 | 2016-02-18 21:40 前言 不知不觉,技术人生系列·我和数据中心的故事来 ...
最新文章
- 【专题】“莓日一介”之(BlackBerry 7230“经典”)
- sql 随机数高效率算法
- 使用 Eclipse + PyDev 开发 Google App Engine 程序
- Alibaba Cluster Data 开源:270GB 数据揭秘你不知道的阿里巴巴数据中心
- 十种图像模糊算法的总结与实现
- 解决:Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408,
- chrome浏览器,开发工具一些常用快捷键
- java接口_Java接口
- 深入理解ButterKnife源码并掌握原理(四)
- intellij 专业版 TomCat9
- 15拆分成3个不同的自然数_素数大概有多少个?15岁的高斯翻过素数表之后给出了答案...
- 使用weblogic部署若依项目(图文教程)
- ssh远程连接阿里云服务器
- 计算机开平方的三种算法
- Rough Set Theory
- Altium Designer使用介绍和界面介绍
- [配置] 安卓 | 将微信公众号文章保存到Notion
- Python BeautifulSoup简介
- 网络基础--搭建一个简单的网络
- 校长娱乐-我叫MT高级技能出处
热门文章
- 版本管理工具:Gitlab
- PPT模板 | 蓝色科技风项目介绍PPT模板
- 2021_GDUT_新生专题训练_数论
- 页面切换成黑白,公祭日,哀悼可用
- 1月3日,30秒知全网,精选7个热点
- 546计算机综合什么意思,重装系统时出现File Name?(546)的错误该怎么解决?
- 搭建Windows 家庭用无线局域网WLAN (Wireless Local Area Network)
- 用Selenium + ChromeDriver 实现多屏滑动截取+拼接(有源码)
- Powershell创建软连接、硬链接、Junction
- 微信分销试试汉全的解决方案