javascript
全网最详细SpringBatch读(Reader)混合文件讲解
文章列表
- 一、讀混合記錄文件
- 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:讀混合文件
總結
以上是生活随笔為你收集整理的全网最详细SpringBatch读(Reader)混合文件讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全网最详细SpringBatch读(Re
- 下一篇: 开源调度框架xxl-job集成Sprin