千家信息网

Spring-batch(ItemReader)—数据读取从普通文件,数据库,XML,多文件数据读取

发表于:2024-10-08 作者:千家信息网编辑
千家信息网最后更新 2024年10月08日,Spring-Batch学习总结(3)--如何数据输入一.ItemReader概述1.ItemReader:提供数据的接口2.在这个接口中只有一个方法read(),它读取一个数据并且移动到下一个数据上
千家信息网最后更新 2024年10月08日Spring-batch(ItemReader)—数据读取从普通文件,数据库,XML,多文件数据读取

Spring-Batch学习总结(3)--如何数据输入
一.ItemReader概述
1.ItemReader:提供数据的接口
2.在这个接口中只有一个方法read(),它读取一个数据并且移动到下一个数据上去,在读取结束时必须返回一个null,否则表明数据没有读取完毕;
例:
OverViewApplication:

package com.dhcc.batch.batchDemo.input.overview;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableBatchProcessingpublic class OverViewApplication {    public static void main(String[] args) {        SpringApplication.run(OverViewApplication.class, args);    }}

InputOverViewDemoJobConfiguration:

package com.dhcc.batch.batchDemo.input.overview;import java.util.Arrays;import java.util.List;import org.springframework.batch.core.Job;import org.springframework.batch.core.Step;import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;import org.springframework.batch.item.ItemWriter;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class InputOverViewDemoJobConfiguration {    @Autowired    private JobBuilderFactory jobBuilderFactory;    @Autowired    private StepBuilderFactory stepBuilderFactory;    @Bean    public Job inputOverViewDemoJob() {        return jobBuilderFactory.get("inputOverViewDemoJob").start(inputOverViewDemoJobStep()).build();    }    public Step inputOverViewDemoJobStep() {        return stepBuilderFactory.get("inputOverViewDemoJobStep").chunk(2)                .reader(inputOverViewDemoReader()).writer(outputOverViewDemoWriter()).build();    }    private ItemWriter outputOverViewDemoWriter() {        return new ItemWriter() {            @Override            public void write(List items) throws Exception {                for (String item : items) {                    System.out.println("output writer data: " + item);                }            }        };    }    @Bean    public InputOverVierDemoItemReader inputOverViewDemoReader() {        List data = Arrays.asList("dazhonghua", "xiaoriben", "meilijian", "falanxi", "deyizhi", "aierlan",                "fandigang", "bajisitan", "baieluosi");        return new InputOverVierDemoItemReader(data);    }}

InputOverVierDemoItemReader:

package com.dhcc.batch.batchDemo.input.overview;import java.util.Iterator;import java.util.List;import org.springframework.batch.item.ItemReader;import org.springframework.batch.item.NonTransientResourceException;import org.springframework.batch.item.ParseException;import org.springframework.batch.item.UnexpectedInputException;public class InputOverVierDemoItemReader implements ItemReader {    private final Iterator iterator;    public InputOverVierDemoItemReader(List data) {        this.iterator = data.iterator();    }    @Override    public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {        if (iterator.hasNext()) {            return this.iterator.next();        } else {            return null;        }    }}

运行结果:

二.从数据库中读取数据
1.在实际应用中,我们都需要从数据库中读取数据,并且进行分页读取,在spring-batch中为我们提供了JDBCPagingItemReader这个类进行数据库数据读取
2.例:再举这个例子之前我们在数据库中建立了个person_buf表,并向表中插入了100001条数据


接下来我们读取这个表中的数据为例,进行学习:
InputItemReaderJDBCApplication:

package com.dhcc.batch.batchDemo.input.db.jdbc;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableBatchProcessingpublic class InputItemReaderJDBCApplication {    public static void main(String[] args) {        SpringApplication.run(InputItemReaderJDBCApplication.class, args);    }}

InputDBJdbcItemReaderConfigruation:

package com.dhcc.batch.batchDemo.input.db.jdbc;import java.util.HashMap;import java.util.Map;import javax.sql.DataSource;import org.springframework.batch.core.Job;import org.springframework.batch.core.Step;import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepScope;import org.springframework.batch.item.ItemWriter;import org.springframework.batch.item.database.JdbcPagingItemReader;import org.springframework.batch.item.database.Order;import org.springframework.batch.item.database.support.MySqlPagingQueryProvider;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class InputDBJdbcItemReaderConfigruation {    @Autowired    private JobBuilderFactory jobBuilderFactory;    @Autowired    private StepBuilderFactory stepBuilderFactory;    @Autowired    @Qualifier("DBJdbcWriterDemo")    private ItemWriter DBJbbcWriterDemo;    @Autowired    private DataSource dataSource;    @Bean    public Job DBJdbcItemReaderJob() {        return jobBuilderFactory.get("DBJdbcItemReaderJob4")                .start(DBJdbcItemReaderJobStep())                .build();    }    @Bean    public Step DBJdbcItemReaderJobStep() {        return stepBuilderFactory.get("DBJdbcItemReaderJobStep4")                .chunk(100)                .reader(DBJbbcReaderDemo())                .writer(DBJbbcWriterDemo)                .build();    }    @Bean    @StepScope    public JdbcPagingItemReader DBJbbcReaderDemo() {        JdbcPagingItemReader reader = new JdbcPagingItemReader<>();        reader.setDataSource(this.dataSource); // 设置数据源        reader.setFetchSize(100); // 设置一次最大读取条数        reader.setRowMapper(new PersonRowMapper()); // 把数据库中的每条数据映射到Person对中        MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider();        queryProvider.setSelectClause("id,name,per_desc,create_time,update_time,sex,score,price"); // 设置查询的列        queryProvider.setFromClause("from person_buf"); // 设置要查询的表        Map sortKeys = new HashMap();// 定义一个集合用于存放排序列        sortKeys.put("id", Order.ASCENDING);// 按照升序排序        queryProvider.setSortKeys(sortKeys);        reader.setQueryProvider(queryProvider);// 设置排序列        return reader;    }}

DBJdbcWriterDemo:

package com.dhcc.batch.batchDemo.input.db.jdbc;import java.util.List;import org.springframework.batch.item.ItemWriter;import org.springframework.stereotype.Component;@Component("DBJdbcWriterDemo")public class DBJdbcWriterDemo implements ItemWriter{    @Override    public void write(List items) throws Exception {        for(Person person:items) {            System.out.println(person);        }    }}

Person

package com.dhcc.batch.batchDemo.input.db.jdbc;import java.util.Date;public class Person {    private Integer id;    private String name;    private String perDesc;    private Date createTime;    private Date updateTime;    private String sex;    private Float score;    private Double price;    public Person() {        super();    }    public Person(Integer id, String name, String perDesc, Date createTime, Date updateTime, String sex, Float score,            Double price) {        super();        this.id = id;        this.name = name;        this.perDesc = perDesc;        this.createTime = createTime;        this.updateTime = updateTime;        this.sex = sex;        this.score = score;        this.price = price;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Date getCreateTime() {        return createTime;    }    public String getPerDesc() {        return perDesc;    }    public void setPerDesc(String perDesc) {        this.perDesc = perDesc;    }    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    public Date getUpdateTime() {        return updateTime;    }    public void setUpdateTime(Date updateTime) {        this.updateTime = updateTime;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public Float getScore() {        return score;    }    public void setScore(Float score) {        this.score = score;    }    public Double getPrice() {        return price;    }    public void setPrice(Double price) {        this.price = price;    }    @Override    public String toString() {        return "Person [id=" + id + ", name=" + name + ", perDesc=" + perDesc + ", createTime=" + createTime + ", updateTime="                + updateTime + ", sex=" + sex + ", score=" + score + ", price=" + price + "]";    }}

PersonRowMapper:

package com.dhcc.batch.batchDemo.input.db.jdbc;import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.jdbc.core.RowMapper;/** * 实现将数据库中的每条数据映射到Person对象中 * @author Administrator * */public class PersonRowMapper implements RowMapper {    /**     * rs一条结果集,rowNum代表当前行     */    @Override    public Person mapRow(ResultSet rs, int rowNum) throws SQLException {        return new Person(rs.getInt("id")                ,rs.getString("name")                ,rs.getString("per_desc")                ,rs.getDate("create_time")                ,rs.getDate("update_time")                ,rs.getString("sex")                ,rs.getFloat("score")                ,rs.getDouble("price"));    }}

运行结果:

1.FlatFileItemReader:
(1)set lines to skip:设置跳过前几行
(2)set resource:指定源文件地址
(3)设置一个行解析器映射行对应的结果集
2.例:我们在项目中的resources中放入了两个csv文件,我们以读取springbatchtest1.csv为例:
(1)观察文件存放路径:

(2)展示部分文件结构:

(3)编写代码:
AlipayTranDo :

package com.dhcc.batch.batchDemo.input.flatFile;public class AlipayTranDo {        private String tranId;        private String channel;        private String tranType;        private String counterparty;        private String goods;        private String amount;        private String isDebitCredit;        private String state;        public AlipayTranDo(String tranId, String channel, String tranType, String counterparty, String goods,                String amount, String isDebitCredit, String state) {            super();            this.tranId = tranId;            this.channel = channel;            this.tranType = tranType;            this.counterparty = counterparty;            this.goods = goods;            this.amount = amount;            this.isDebitCredit = isDebitCredit;            this.state = state;        }        public String getTranId() {            return tranId;        }        public void setTranId(String tranId) {            this.tranId = tranId;        }        public String getChannel() {            return channel;        }        public void setChannel(String channel) {            this.channel = channel;        }        public String getTranType() {            return tranType;        }        public void setTranType(String tranType) {            this.tranType = tranType;        }        public String getCounterparty() {            return counterparty;        }        public void setCounterparty(String counterparty) {            this.counterparty = counterparty;        }        public String getGoods() {            return goods;        }        public void setGoods(String goods) {            this.goods = goods;        }        public String getAmount() {            return amount;        }        public void setAmount(String amount) {            this.amount = amount;        }        public String getIsDebitCredit() {            return isDebitCredit;        }        public void setIsDebitCredit(String isDebitCredit) {            this.isDebitCredit = isDebitCredit;        }        public String getState() {            return state;        }        public void setState(String state) {            this.state = state;        }        @Override        public String toString() {            return "AlipayTranDO{" +                    "tranId='" + tranId + '\'' +                    ", channel='" + channel + '\'' +                    ", tranType='" + tranType + '\'' +                    ", counterparty='" + counterparty + '\'' +                    ", goods='" + goods + '\'' +                    ", amount='" + amount + '\'' +                    ", isDebitCredit='" + isDebitCredit + '\'' +                    ", state='" + state + '\'' +                    '}';        }    }

AlipayTranDoFileMapper:

package com.dhcc.batch.batchDemo.input.flatFile;import org.springframework.batch.item.file.mapping.FieldSetMapper;import org.springframework.batch.item.file.transform.FieldSet;import org.springframework.validation.BindException;public class AlipayTranDoFileMapper implements FieldSetMapper {    @Override    public AlipayTranDo mapFieldSet(FieldSet fieldSet) throws BindException {        return new AlipayTranDo(fieldSet.readString("tranId")                , fieldSet.readString("channel")                ,fieldSet.readString("tranType")                , fieldSet.readString("counterparty")                , fieldSet.readString("goods")                ,fieldSet.readString("amount")                , fieldSet.readString("isDebitCredit")                , fieldSet.readString("state")                );    }}

FlatFileWriterDemo:

package com.dhcc.batch.batchDemo.input.flatFile;import java.util.List;import org.springframework.batch.item.ItemWriter;import org.springframework.stereotype.Component;@Component("FlatFileWriterDemo")public class FlatFileWriterDemo implements ItemWriter{    @Override    public void write(List items) throws Exception {        for(AlipayTranDo alipayTranDo:items) {            System.out.println(alipayTranDo);        }    }}

InputFaltFileItemReaderConfigruation:

package com.dhcc.batch.batchDemo.input.flatFile;import org.springframework.batch.core.Job;import org.springframework.batch.core.Step;import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepScope;import org.springframework.batch.item.ItemWriter;import org.springframework.batch.item.file.FlatFileItemReader;import org.springframework.batch.item.file.mapping.DefaultLineMapper;import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;@Configurationpublic class InputFaltFileItemReaderConfigruation {    @Autowired    private JobBuilderFactory jobBuilderFactory;    @Autowired    private StepBuilderFactory stepBuilderFactory;    @Autowired    @Qualifier("FlatFileWriterDemo")    private ItemWriter FlatFileWriterDemo;    @Bean    public Job FaltFileItemReaderJob() {        return jobBuilderFactory.get("FaltFileItemReaderJob")                .start(FaltFileItemReaderJobStep())                .build();    }    @Bean    public Step FaltFileItemReaderJobStep() {        return stepBuilderFactory.get("FaltFileItemReaderJobStep")                .chunk(100)                .reader(FaltFileReaderDemo())                .writer(FlatFileWriterDemo)                .build();    }    @Bean    @StepScope    public FlatFileItemReader FaltFileReaderDemo() {        FlatFileItemReader reader=new FlatFileItemReader();        reader.setResource(new ClassPathResource("/data/init/springbatchtest1.csv"));        reader.setLinesToSkip(5);        DelimitedLineTokenizer tokenizer=new DelimitedLineTokenizer();        tokenizer.setNames(new String[]                 {"tranId","channel","tranType","counterparty","goods","amount","isDebitCredit","state"}        );        DefaultLineMapper lineMapper=new DefaultLineMapper();        lineMapper.setLineTokenizer(tokenizer);        lineMapper.setFieldSetMapper(new AlipayTranDoFileMapper());        lineMapper.afterPropertiesSet();        reader.setLineMapper(lineMapper);        return reader;    }}

InputItemReaderFileApplication:

package com.dhcc.batch.batchDemo.input.flatFile;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableBatchProcessingpublic class InputItemReaderFileApplication {    public static void main(String[] args) {        SpringApplication.run(InputItemReaderFileApplication.class, args);    }}

运行结果:

四.使用ItemReader从xml文件中读取数据
1.使用StaxEventItemReader读取xml数据
2.例:在项目中加入一个weather.xml文件,以读取此文件为例
观察xml文件数据结构:



2018-10-08
d07|n02
小雨转阴
19/9℃
西南风


2018-10-09
d01|n00
多云转晴
21/7℃
东北风


2018-10-10
d00|n01
晴转多云
20/8℃
东北风3-4级转


2018-10-11
d01|n01
多云
18/9℃
东北风


2018-10-12
d00|n02
晴转阴
18/12℃
东北风


2018-10-13
d02|n02

18/13℃
北风转南风


2018-10-14
d01|n02
多云转阴
17/11℃
东北风3-4级转


使用spring batch读取xml文件数据代码如下:
WeatherData:

package com.dhcc.batch.batchDemo.input.xmlFile;public class WeatherData {    private String date;    private String icon;    private String weather;    private String temperature;    private String winddirect;    public WeatherData() {        super();    }    public WeatherData(String date, String icon, String weather, String temperature, String winddirect) {        super();        this.date = date;        this.icon = icon;        this.weather = weather;        this.temperature = temperature;        this.winddirect = winddirect;    }    public String getDate() {        return date;    }    public void setDate(String date) {        this.date = date;    }    public String getIcon() {        return icon;    }    public void setIcon(String icon) {        this.icon = icon;    }    public String getWeather() {        return weather;    }    public void setWeather(String weather) {        this.weather = weather;    }    public String getTemperature() {        return temperature;    }    public void setTemperature(String temperature) {        this.temperature = temperature;    }    public String getWinddirect() {        return winddirect;    }    public void setWinddirect(String winddirect) {        this.winddirect = winddirect;    }    @Override    public String toString() {        return "WeatherData [date=" + date + ", icon=" + icon + ", weather=" + weather + ", temperature=" + temperature                + ", winddirect=" + winddirect + "]";    }}

XMLFileDemoJobConfiguration :

package com.dhcc.batch.batchDemo.input.xmlFile;import java.util.HashMap;import java.util.Map;import org.springframework.batch.core.Job;import org.springframework.batch.core.Step;import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepScope;import org.springframework.batch.item.ItemWriter;import org.springframework.batch.item.xml.StaxEventItemReader;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.oxm.xstream.XStreamMarshaller;@Configurationpublic class XMLFileDemoJobConfiguration {    @Autowired    private JobBuilderFactory jobBuilderFactory;    @Autowired    private StepBuilderFactory stepBuilderFactory;    @Autowired    @Qualifier("XMLFileWriterDemo")    private ItemWriter XMLFileWriterDemo;    @Bean    public Job XMLFileDemoReaderJobTwo() {        return jobBuilderFactory.get("XMLFileDemoReaderJobTwo")                .start(XMLFileDemoReaderStepTwo())                .build();    }    @Bean    public Step XMLFileDemoReaderStepTwo() {        return stepBuilderFactory.get("XMLFileDemoReaderStepTwo")                .chunk(2)                .reader(XMLFileItemReader())                .writer(XMLFileWriterDemo)                .build();    }    @Bean    @StepScope    public StaxEventItemReader XMLFileItemReader() {        StaxEventItemReader reader=new StaxEventItemReader();        reader.setResource(new ClassPathResource("/xdata/init/weather.xml"));        reader.setFragmentRootElementName("data");        XStreamMarshaller unmarshaller=new XStreamMarshaller();        Map map=new HashMap<>();        map.put("data", WeatherData.class);        unmarshaller.setAliases(map);        reader.setUnmarshaller(unmarshaller);//序列化        return reader;    }}

XMLFileWriterDemo :

package com.dhcc.batch.batchDemo.input.xmlFile;import java.util.List;import org.springframework.batch.item.ItemWriter;import org.springframework.stereotype.Component;@Component("XMLFileWriterDemo")public class XMLFileWriterDemo implements ItemWriter{    @Override    public void write(List items) throws Exception {        for(WeatherData weatherInfo:items) {            System.out.println(weatherInfo);        }    }}

XmlFileReaderApplication :

package com.dhcc.batch.batchDemo.input.xmlFile;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableBatchProcessingpublic class XmlFileReaderApplication {    public static void main(String[] args) {        SpringApplication.run(XmlFileReaderApplication.class, args);    }}

运行结果:

观察结果可得,我们成功的读取了xml文件
五.从多个文件读取数据
1.在一个给定的目录下一次读取多个文件时非常常见的
2.我们可以使用MultiResourceItemReader来注册一个input file并且设置代理的ItemReader去处理每一个源文件
例:我们在项目中同时存放两个csv文件,如下所示:

我们以读取这两个文件为例:
代码:
实体类与上面例子实体类一样AlipaytranDo,不做展示
AlipayTranDoMutipleMapper :

package com.dhcc.batch.batchDemo.input.mutiple;import org.springframework.batch.item.file.mapping.FieldSetMapper;import org.springframework.batch.item.file.transform.FieldSet;import org.springframework.validation.BindException;public class AlipayTranDoMutipleMapper implements FieldSetMapper {    @Override    public AlipayTranDo mapFieldSet(FieldSet fieldSet) throws BindException {        return new AlipayTranDo(fieldSet.readString("tranId")                , fieldSet.readString("channel")                ,fieldSet.readString("tranType")                , fieldSet.readString("counterparty")                , fieldSet.readString("goods")                ,fieldSet.readString("amount")                , fieldSet.readString("isDebitCredit")                , fieldSet.readString("state")                );    }}

MutipleFileDemoReaderApplication :

package com.dhcc.batch.batchDemo.input.mutiple;import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableBatchProcessingpublic class MutipleFileDemoReaderApplication {    public static void main(String[] args) {        SpringApplication.run(MutipleFileDemoReaderApplication.class, args);    }}

MutipleFileDemoReaderConfiguration :

package com.dhcc.batch.batchDemo.input.mutiple;import org.springframework.batch.core.Job;import org.springframework.batch.core.Step;import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;import org.springframework.batch.core.configuration.annotation.StepScope;import org.springframework.batch.item.ItemWriter;import org.springframework.batch.item.file.FlatFileItemReader;import org.springframework.batch.item.file.MultiResourceItemReader;import org.springframework.batch.item.file.mapping.DefaultLineMapper;import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.Resource;@Configurationpublic class MutipleFileDemoReaderConfiguration {    @Autowired    private JobBuilderFactory jobBuilderFactory;    @Autowired    private StepBuilderFactory stepBuilderFactory;    @Autowired    @Qualifier("MutipleFileItemWriterDemo")    private ItemWriter MutipleFileItemWriterDemo;    @Value("classpath*:/data/init/springbatchtest*.csv")    private Resource[] resources;    @Bean    public Job MutipleFileDemoReaderJob3() {        return jobBuilderFactory.get("MutipleFileDemoReaderJob3")                .start(MutipleFileDemoItemReaderJobStep3())                .build();    }    @Bean    public Step MutipleFileDemoItemReaderJobStep3() {        return stepBuilderFactory.get("MutipleFileDemoItemReaderJobStep3")                .chunk(100)                .reader(MutipleResourceItemReaderDemo())                .writer(MutipleFileItemWriterDemo)                .build();    }    @Bean    @StepScope    public MultiResourceItemReader MutipleResourceItemReaderDemo() {        MultiResourceItemReader reader=new MultiResourceItemReader();        reader.setDelegate(FaltFileReaderDemo());        reader.setResources(resources);        return reader;    }    @Bean    @StepScope    public FlatFileItemReader FaltFileReaderDemo() {        FlatFileItemReader reader=new FlatFileItemReader();//      reader.setResource(new ClassPathResource("alipayTranDo"));        reader.setLinesToSkip(5);        DelimitedLineTokenizer tokenizer=new DelimitedLineTokenizer();        tokenizer.setNames(new String[]                 {"tranId","channel","tranType","counterparty","goods","amount","isDebitCredit","state"}        );        DefaultLineMapper lineMapper=new DefaultLineMapper();        lineMapper.setLineTokenizer(tokenizer);        lineMapper.setFieldSetMapper(new AlipayTranDoMutipleMapper());        lineMapper.afterPropertiesSet();        reader.setLineMapper(lineMapper);        return reader;    }}

MutipleFileItemWriterDemo :

package com.dhcc.batch.batchDemo.input.mutiple;import java.util.List;import org.springframework.batch.item.ItemWriter;import org.springframework.stereotype.Component;@Component("MutipleFileItemWriterDemo")public class MutipleFileItemWriterDemo implements ItemWriter{    @Override    public void write(List items) throws Exception {        for(AlipayTranDo alipayTranDo:items) {            System.out.println(alipayTranDo);        }    }}

六.ItemReader异常处理及重启
1.对于chunk类型的Step,spring batch为我们提供了用于管理它的状态
2.状态的管理是通过ItemStream接口来实现的
3.ItemStream接口:
(1)open():每一次step执行会调用
(2)Update():每一个chunk去执行都会调用
(3)Close():所有的chunk执行完毕会调用
4.图形:

此处不再展示例子

最后附上项目pom.xml

    4.0.0    com.dhcc.batch    batchDemo    0.0.1-SNAPSHOT    jar    batchDemo    Demo project for Spring Boot            org.springframework.boot        spring-boot-starter-parent        2.0.4.RELEASE                         UTF-8        UTF-8        1.8                            org.springframework.boot            spring-boot-starter-batch                            org.springframework.boot            spring-boot-starter-test            test                            org.springframework.batch            spring-batch-test            test                                            org.springframework            spring-oxm            5.0.8.RELEASE                                    com.thoughtworks.xstream            xstream            1.4.10                                    org.springframework.boot            spring-boot-starter-jdbc                            mysql            mysql-connector-java            runtime                                                    org.springframework.boot                spring-boot-maven-plugin                        
数据 文件 数据库 结果 东北风 接口 项目 运行 两个 代码 例子 排序 观察 多个 实体 源文件 状态 结构 UTF-8 处理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 元宇宙是否有可能和网络安全结合 网络技术考本科 服务器运行程序自动出现多个线程 软件开发人生规划书 浙江机械软件开发市场报价 天津服务器代理 服务器404文件错误 标题计算机网络安全主要 服务器系统远程功能是否正常 imei删除应用数据库 安天网络安全技术有限公司宣传片 电信公司网络安全隐患 传奇数据库刷装备 芜湖市天气预报软件开发 党员数据库 网络安全是如何来的 阿里云服务器设置密码 企业如何提升软件开发能力 网络技术学习计划作文 虎跳网络技术有限公司 如何在德温特数据库中找绿色专利 计算机网络技术升本简单吗 天津现代职业学院网络技术怎么样 用树莓派3b搭建服务器如何 软件开发是外包还是自己做 流放之路元素要害数据库 网络安全工作哪些好 加入dna数据库有什么坏处 数据库单设置精度型 东营软件开发有哪些公司
0