javascript
全网最详细springbatch读(reader)混合文件讲解 -凯发k8官方网
文章列表
- 一、读混合记录文件
- 1、fieldsetmapper实现
- 2、linetokenizer实现
- 3、混合读reader实现类
- 4、读混合文件job配置
- 5、读混合文件processor
- 6、读混合文件writer
写在前面:
我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。
写博客的目的就是分享给大家一起学习交流,如果您对 java感兴趣,可以关注我,我们一起学习。
前言:在工作中可能会遇到一个文件存在多种不同的记录需要处理,不要慌springbatch已经给我们预留好接口处理这类文件。下面让我们来一探究竟把。
一、读混合记录文件
一般情况下读文件中的记录格式是一致的,在特殊情况下一个文件中存在多种不同的记录格式,通过特定的开头可以区分不同的记录。例如下面文件,以41开头代表信用卡消费记录,以31开头代表借记卡消费记录。
springbatch框架对文件中存在不同记录格式同样有友好的支持,通过复杂数据转换类patternmatchingcompositelinemapper,可以为不同记录定义不同的linetokenizer和fieldsetmapper进行数据转换。
混合记录读主要类图如下:
patternmatchingcompositelinemapper:为不同的记录转变不同的linetokenizer和fieldsetmapper实现数据转换
1、fieldsetmapper实现
1、creditbillfieldsetmapper借记卡数据转换类,将3*格式的记录转换为领域对象creditbill
/*** @author shuliangzhao* @date 2020/12/6 14:22*/ public class creditbillfieldsetmapper implements fieldsetmapper<creditanddebitbill> {@overridepublic creditanddebitbill mapfieldset(fieldset fieldset) throws bindexception {creditanddebitbill creaditanddebitbill = new creditanddebitbill();creditbill creditbill = new creditbill();creditbill.setname(fieldset.readstring("name"));creditbill.setdate(fieldset.readdate("date"));creditbill.setamout(fieldset.readint("amout"));creditbill.setaddress(fieldset.readstring("address"));creditbill.setacctid(fieldset.readstring("acctid"));creaditanddebitbill.setcreditbill(creditbill);return creaditanddebitbill;} }2、debitbillfieldsetmapper贷记卡数据转换类,将4*格式的记录转换为领域对象debitbill
/*** @author shuliangzhao* @date 2020/12/6 14:26*/ public class debitbillfieldsetmapper implements fieldsetmapper<creditanddebitbill> {@overridepublic creditanddebitbill mapfieldset(fieldset fieldset) throws bindexception {creditanddebitbill creditanddebitbill = new creditanddebitbill();debitbill debitbill = new debitbill();debitbill.setacctid(fieldset.readstring("acctid"));debitbill.setamout(fieldset.readint("amout"));debitbill.setdate(fieldset.readdate("date"));debitbill.setname(fieldset.readstring("name"));creditanddebitbill.setdebitbill(debitbill);return creditanddebitbill;} }2、linetokenizer实现
1、creditbilltokenizer借记卡分隔器处理类
/*** @author shuliangzhao* @date 2020/12/6 14:03*/ public class creditbilltokenizer extends delimitedlinetokenizer {@overridepublic fieldset tokenize(string line) {return super.tokenize(line);} }2、debitbilltokenizer贷记卡分隔器处理类
/*** @author shuliangzhao* @title: debitbilltokenizer* @projectname spring-boot-learn* @description: todo* @date 2020/12/6 14:06*/ public class debitbilltokenizer extends delimitedlinetokenizer {@overridepublic fieldset tokenize(string line) {return super.tokenize(line);} }3、混合读reader实现类
混合读文件patternmatchfilereader封装
/*** 读取混合文件reader* @author shuliangzhao* @date 2020/12/6 13:55*/ public class patternmatchfilereader extends flatfileitemreader {public patternmatchfilereader(class clz,class clz1) {setresource(commonutil.createresource("d:\\aplus\\muliti\\pattern.csv"));patternmatchingcompositelinemapper patternmatchingcompositelinemapper = new patternmatchingcompositelinemapper();map<string, linetokenizer> map = new hashmap<>();createtokenizer(map,clz,clz1);patternmatchingcompositelinemapper.settokenizers(map);map<string, fieldsetmapper> map1 = new hashmap<>();createfieldsetmapper(map1,clz,clz1);patternmatchingcompositelinemapper.setfieldsetmappers(map1);setlinemapper(patternmatchingcompositelinemapper);}private void createfieldsetmapper(map<string, fieldsetmapper> map1,class clz,class clz1) {debitbillfieldsetmapper debitbillfieldsetmapper = new debitbillfieldsetmapper();creditbillfieldsetmapper creditbillfieldsetmapper = new creditbillfieldsetmapper();map1.put("4*",creditbillfieldsetmapper);map1.put("3*",debitbillfieldsetmapper);}private void createtokenizer(map<string, linetokenizer> map,class clz,class clz1) {creditbilltokenizer creditbilltokenizer = new creditbilltokenizer();creditbilltokenizer.setnames(commonutil.names(clz));creditbilltokenizer.setdelimiter(",");debitbilltokenizer debitbilltokenizer = new debitbilltokenizer();debitbilltokenizer.setnames(commonutil.names(clz1));debitbilltokenizer.setdelimiter(",");map.put("4*",creditbilltokenizer);map.put("3*",debitbilltokenizer);} }注意:map存放key为4和3。至于为什么要这样存放请看patternmatcher这个match方法
4、读混合文件job配置
读混合文件job基于javabean配置如下
/*** @author shuliangzhao* @date 2020/12/6 14:18*/ @configuration @enablebatchprocessing public class patternmatchconfigruation {@autowiredprivate jobbuilderfactory jobbuilderfactory;@autowiredprivate stepbuilderfactory stepbuilderfactory;@autowiredprivate patternmatchprocessor patternmatchprocessor;@autowiredprivate patternmatchwriter patternmatchwriter;@beanpublic job patternmatchjob() {return jobbuilderfactory.get("patternmatchjob").start(patternmatchstep()).build();}@beanpublic step patternmatchstep() {return stepbuilderfactory.get("patternmatchstep").<creditanddebitbill,creditanddebitbill>chunk(2).reader(patternmatchfilereader()).processor(patternmatchprocessor).writer(patternmatchwriter).build();}@bean@stepscopepublic patternmatchfilereader patternmatchfilereader() {return new patternmatchfilereader(creditbill.class, debitbill.class);} }5、读混合文件processor
patternmatchprocessor实现如下:
/*** @author shuliangzhao* @date 2020/12/6 14:32*/ @component @stepscope public class patternmatchprocessor implements itemprocessor<creditanddebitbill,creditanddebitbill> {@overridepublic creditanddebitbill process(creditanddebitbill item) throws exception {creditanddebitbill creditanddebitbill = new creditanddebitbill();if (item.getcreditbill() != null) {creditbill creditbill = new creditbill();beanutils.copyproperties(item.getcreditbill(),creditbill);creditanddebitbill.setcreditbill(creditbill);}if (item.getdebitbill() != null) {debitbill debitbill = new debitbill();beanutils.copyproperties(item.getdebitbill(),debitbill);creditanddebitbill.setdebitbill(debitbill);}return creditanddebitbill;} }6、读混合文件writer
patternmatchwriter 实现如下:
/*** @author shuliangzhao* @date 2020/12/6 14:35*/ @component @stepscope public class patternmatchwriter implements itemwriter<creditanddebitbill> {@autowiredprivate creditbillmapper creditbillmapper;@autowiredprivate debitbillmapper debitbillmapper;@overridepublic void write(list<? extends creditanddebitbill> items) throws exception {for (creditanddebitbill creditanddebitbill:items) {if (creditanddebitbill.getdebitbill() != null) {debitbillmapper.insert(creditanddebitbill.getdebitbill());}if (creditanddebitbill.getcreditbill() != null) {creditbillmapper.insert(creditanddebitbill.getcreditbill());}}} }至此,我们完成了读混合文件的处理。
如果想更详细查看以上所有代码请移步到github:读混合文件
总结
以上是凯发k8官方网为你收集整理的全网最详细springbatch读(reader)混合文件讲解的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 全网最详细springbatch读(re
- 下一篇: 开源调度框架xxl-job集成sprin