Spring Batch之读数据—读多文件(三十三)

一、读多文件

        前面的所有文件的读取基本上是对单文件执行的,在实际应用中,我们经常操作批量的文件。

        Spring Batch框架提供了现有的组件MultiResourceItemReader支持对多文件的读取,通过MultiResourceItemReader读取批量文件非常简单。MultiResourceItemReader通过代理的ItemReader来读取问津。

MultiResourceItemReader关键属性:

MultiResourceItemReader属性类型说明
delegateResourceAwareItemReaderItemStreamIteamReader的代理,将resources中定义的文件代理给当前指定的ItemReader进行处理
resourcesResource[]需要读取的资源文件列表
strickboolean

定义读取文件不存在时候的策略,如果为true则抛出异常,如果为false表示不抛出异常。

默认值为true

saveStateboolean

保存状态标识,读取资源时候是否保存当前读取的文件及当前文件是否读取条目记录的状态。

默认值为true

二、项目实例

1.项目框架

 2.代码实现

BatchMain.java:

package com.xj.demo25;import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @Author : xjfu* @Date : 2021/10/26 20:01* @Description : demo25 读多文件*/
public class BatchMain {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("demo25/job/demo25-job.xml");//Spring Batch的作业启动器,JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");//在batch.xml中配置的一个作业Job job  = (Job)context.getBean("billJob");try{//开始执行这个作业,获得处理结果(要运行的job,job参数对象)JobExecution result = launcher.run(job, new JobParameters());System.out.println(result.toString());}catch (Exception e){e.printStackTrace();}}
}

CreditBill.java:

package com.xj.demo25;/*** @Author : xjfu* @Date : 2021/10/26 19:27* @Description :*/
public class CreditBill {//银行卡账户IDprivate String accountID = "";//持卡人姓名private String name = "";//消费金额private double amount = 0;//消费日期private String date = "";//消费场所private String address = "";public String getAccountID() {return accountID;}public void setAccountID(String accountID) {this.accountID = accountID;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return this.accountID + "," + this.name + "," + this.amount + "," + this.date + "," + this.address;}
}

CreditBillFieldSetMapper.java:

package com.xj.demo25;import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.validation.BindException;
/*** @Author : xjfu* @Date : 2023/07/13 11:32* @Description : 将FieldSet对象转为CreditBill对象*/
public class CreditBillFieldSetMapper implements FieldSetMapper<CreditBill> {public CreditBill mapFieldSet(FieldSet fieldSet) throws BindException {CreditBill result = new CreditBill();result.setAccountID(fieldSet.readString("accountID"));result.setName(fieldSet.readString("name"));result.setAmount(fieldSet.readDouble("amount"));result.setDate(fieldSet.readString("date"));result.setAddress(fieldSet.readString("address"));return result;}
}

demo25-job.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:batch="http://www.springframework.org/schema/batch"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd"><!--导入文件--><import resource="classpath:demo25/job/demo25-jobContext.xml"/><!--定义名字为billJob的作业--><batch:job id="billJob"><!--定义名字为billStep的作业步--><batch:step id="billStep"><batch:tasklet transaction-manager="transactionManager"><!--定义读、处理、写操作,规定每处理两条数据,进行一次写入操作,这样可以提高写的效率--><batch:chunk reader="multiResourceReader" writer="csvItemWriter" commit-interval="2"></batch:chunk></batch:tasklet></batch:step></batch:job>
</beans>

demo25-jobContext.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:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"><!--定义作业仓库 Job执行期间的元数据存储在内存中--><bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"/><!--定义作业调度器,用来启动job--><bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"><!--注入jobRepository--><property name="jobRepository" ref="jobRepository"/></bean><!--定义事务管理器,用于Spring Batch框架中对数据操作提供事务能力--><bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/><!--读多文件使用multiResourceItemReader--><bean id="multiResourceReader" class="org.springframework.batch.item.file.MultiResourceItemReader"><!--需要读取的文件集合--><property name="resources" value="classpath:demo25/data/credit-card-bill-*.csv"/><!--配置具体的文件读取ItemReader--><property name="delegate" ref="flatFileItemReader"/></bean><bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"><!--将一行文件记录转换为Java对象--><property name="lineMapper" ref="lineMapper"/><!--定义严格的文件存在坚持策略,当resource中定义的文件不存在时会导致Job失败--><property name="strict" value="true"/></bean><bean id="lineMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper"><!--使用delimitedLineTokenizer将行记录转换为FieldSet对象--><property name="lineTokenizer" ref="delimitedLineTokenizer"/><!--将FieldSet对象转为CreditBill对象--><property name="fieldSetMapper" ref="creditBillFieldSetMapper"/></bean><!--根据给定的分隔符,将一条记录转换为FieldSet对象--><bean id="delimitedLineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"><!--指定分隔符“,”--><property name="delimiter" value=","/><property name="names" value="accountID,name,amount,date,address"/></bean><bean id="creditBillFieldSetMapper" class="com.xj.demo25.CreditBillFieldSetMapper"/><!--写入类--><bean id="csvItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step"><property name="resource" value="file:src/main/resources/demo25/data/demo25-outputFile.csv"/><property name="lineAggregator"><bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"><property name="delimiter" value=","/><property name="fieldExtractor"><bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"><property name="names" value="accountID,name,amount,date,address"/></bean></property></bean></property></bean><!--注入实体类--><bean id="creditBill" class="com.xj.demo25.CreditBill" scope="prototype"/></beans>

credit-card-bill-201303.csv:

4047390012345678,tom,100.00,2013-2-2 12:00:08,Lu Jia Zui road
4047390012345678,tom,320.00,2013-2-3 10:35:21,Lu Jia Zui road

credit-card-bill-201304.csv:

4047390012345678,tom,674.70,2013-2-6 16:26:49,South Linyi road
4047390012345678,tom,793.20,2013-2-9 15:15:37,Longyang road

credit-card-bill-201305.csv:

4047390012345678,tom,360.00,2013-2-11 11:12:38,Longyang road
4047390012345678,tom,893.00,2013-2-28 20:34:19,Hunan road

3.运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/29780.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云CodeArts产品体验的心得体会及想法

文章目录 前言CodeArts 的产品优势一站式软件开发生产线研发安全Built-In华为多年研发实践能力及规范外溢高质高效敏捷交付 功能特性说明体验感受问题描述完结 前言 华为云作为一家全球领先的云计算服务提供商&#xff0c;致力于为企业和个人用户提供高效、安全、可靠的云服务。…

那些漏洞挖掘高手都是怎么挖漏洞的?

前言 说到安全就不能不说漏洞&#xff0c;而说到漏洞就不可避免地会说到三座大山&#xff1a; 漏洞分析 漏洞利用 漏洞挖掘 从个人的感觉上来看&#xff0c;这三者尽管通常水乳交融、相互依赖&#xff0c;但难度是不尽相同的。本文就这三者分别谈谈自己的经验和想法。 漏洞分析…

解决appium-doctor报opencv4nodejs cannot be found

一、下载cmake 在CMake官网下载&#xff1a;cmake-3.6.1-win64-x64.msi 二、安装cmake cmake安装过程 在安装时要选择勾选为所有用户添加CMake环境变量 三、检查cmake安装 重新管理员打开dos系统cmd命令提示符&#xff0c;输入cmake -version cmake -version四、安装opencv4no…

驱动程序设计 利用RTC显示年月日时分秒到终端 7.11

驱动控制RTC 用户需求&#xff1a;写一个RTC时钟控制的驱动&#xff0c;实现RTC显示年月日时分秒到用户端 驱动需求&#xff1a;设备&#xff1a;RTC模块 功能&#xff1a;打印显示 寄存器操作&#xff1a; 原理图&#xff1a; 设备–>pin–>设备控制芯片 ​ 驱动需求 …

55 # 实现可写流

先在 LinkedList.js 给链表添加一个移除方法 class Node {constructor(element, next) {this.element element;this.next next;} }class LinkedList {constructor() {this.head null; // 链表的头this.size 0; // 链表长度}// 可以直接在尾部添加内容&#xff0c;或者根据…

国内流行的数据可视化软件工具

在信息爆炸的时代&#xff0c;越来越多的数据堆积如山。但是&#xff0c;这些密集的数据没有重点且可读性较差。因此&#xff0c;我们需要数据可视化来帮助数据易于理解和接受。相比之下&#xff0c;可视化更直观、更有意义&#xff0c;使用适当的数据可视化工具来可视化数据非…

密码学总结杂七杂八的wp

快捷键 折叠&#xff08;展开&#xff09;所有代码这里是指按下快捷键后凡事.py文件里可折叠的都折叠。 折叠所有代码&#xff1a;Ctrl Shift - &#xff08;减号&#xff09; 展开所有代码&#xff1a;Ctrl Shift &#xff08;加号&#xff09; 折叠&#xff08;展开&…

在Illustrator中创建 3D 冰淇淋模型对象

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 一旦你学会了如何在Illustrator中制作一个对象3D&#xff0c;你可以前往Envato Elements&#xff0c;在那里你可以找到大量的3D设计来激发你的灵感。这个基于订阅的市场拥有超过 2&#xff0c;000 个 Illus…

一、音频基础-音频分析的重要工具(语谱图)

文章目录 1. 傅里叶转换2. 语谱图3. 应用1. 傅里叶转换 通过前面的描述可以知道,声音的本质就是各种声波,那么任意某一个时刻,都不可能是只有一个频率的波,而且声波也不可能是我们理解的标准的正弦波: 而一般我们对声音进行处理时,需要分析出频率当中的有哪些频率,然…

麒麟SP3X86系统下,安装Oracle11g数据库

目录 1、写在前面 2、准备工作 2.1 环境准备 2.2 数据库安装前准备 2.2.1 安装依赖 2.2.2 系统环境准备 2.2.3 上传软件安装包 2.2.4 安装调图形化界面的依赖和相关设置 3、执行安装程序 1、写在前面 随着国产化进程&#xff0c;各大应用需要在国产服务器上面进行部署…

Python调用ImageMagick生成PDF文件缩略图

使用Python调用ImageMagick生成PDF文件缩略图 Imagemagick使用Ghostscript作为其依赖项之一&#xff0c;以便能够处理和转换PDF相关的图像。 准备 安装Ghostscript&#xff0c;网站安装ImageMagick&#xff0c;网站 安装完毕后&#xff0c;需要自行配置环境路径 脚本 使用示…

准备WebUI自动化测试面试?这30个问题你必须掌握(二)

本文共有11000字&#xff0c;包含了后十五个问题&#xff0c;如需要前十五个问题&#xff0c;可查看文末链接~ 16. 在WebUI自动化测试中&#xff0c;你如何处理验证码或图像识别的问题&#xff1f; 1. 人工识别&#xff1a;一种简单但费时费力的方法是使用人工手动识别验证码。…