如何为不同的记录调用适当的项目处理器? [英] How to call appropriate Item Processor for different records?

查看:30
本文介绍了如何为不同的记录调用适当的项目处理器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含不同记录(页眉、记录和页脚)的平面文件

I have a flat file containing different records(header, record and footer)

HR,...
RD,...
FR,...

物品阅读器

    @Bean
    @StepScope
    public FlatFileItemReader reader(@Value("#{jobParameters['inputFileName']}") String inputFileName) {
        FlatFileItemReader reader = new FlatFileItemReader();
        reader.setResource(new FileSystemResource(inputFileName));
        reader.setLineMapper(patternLineMapper());
        return reader;
    }

    @Bean
    public LineMapper patternLineMapper() {
        PatternMatchingCompositeLineMapper patternLineMapper = new PatternMatchingCompositeLineMapper<>();
        tokenizers = new HashMap<String, LineTokenizer>();
        try {
            tokenizers.put("HR*", headerLineTokenizer());
            tokenizers.put("RD*", recordLineTokenizer());
            tokenizers.put("FR*", footerLineTokenizer());
        } catch (Exception e) {
            e.printStackTrace();
        }
        fieldSetMappers = new HashMap<String, FieldSetMapper>();
        fieldSetMappers.put("HR*", new HeaderFieldSetMapper());
        fieldSetMappers.put("RD*", new RecordFieldSetMapper());
        fieldSetMappers.put("FR*", new FooterFieldSetMapper());
        patternLineMapper.setTokenizers(tokenizers);
        patternLineMapper.setFieldSetMappers(fieldSetMappers);
        return patternLineMapper;
    }

它们工作正常,spring batch 为每条记录调用适当的读取器问题是当涉及到项目处理器时我想使用相同的方法我得到 java.lang.ClassCastException 因为 spring batch尝试将域对象 [从阅读器返回] 映射到 java.lang.String

They are working fine and spring batch calls the appropriate reader for each record the problem is when it comes to item processor I want to use the same approach I get java.lang.ClassCastException cuz spring batch try to map domain object [returned from reader] to java.lang.String

项目处理器

    @Bean
    @StepScope
    public ItemProcessor processor() {

        ClassifierCompositeItemProcessor processor = new ClassifierCompositeItemProcessor();
        PatternMatchingClassifier<ItemProcessor> classifier = new PatternMatchingClassifier<>();
        Map<String, ItemProcessor> patternMap = new HashMap<>();
        patternMap.put("HR*", new HeaderItemProcessor());
        patternMap.put("RD*", new RecordItemProcessor());
        patternMap.put("FR*", new FooterItemProcessor());
        classifier.setPatternMap(patternMap);
        processor.setClassifier(classifier);
        return processor;
    }

我也使用了 BackToBackPatternClassifier 但结果证明它有一个错误,当我使用像 ItemWriter 这样的泛型时,我得到一个异常无法打开文件.问题是如何制作 ItemProcessor 来处理从 Reader 返回的不同记录类型?

I also used BackToBackPatternClassifier but it turns out it has a bug and when I use generics like ItemWriter<Object> I get an exception Couldn't Open File. the question is How can I make ItemProcessor that handles different record types returned from Reader??

推荐答案

您的问题是您在 ClassifierCompositeItemProcessor 中使用的分类器基于字符串模式而不是类型.真正应该发生的事情是这样的:

Your issue is that the classifier you use in the ClassifierCompositeItemProcessor is based on a String pattern and not a type. What really should happen is something like:

阅读器根据输入模式返回特定类型的项目,例如:

The reader returns a specific type of items based on the input pattern, something like:

  • HR* -> HRType
  • RD* -> RDType
  • FR* -> FRType

这就是您在读者方面所做的基本工作.现在在处理端,处理器将接收 HRTypeRDTypeFRType 类型的对象.所以分类器不应该基于String作为输入类型,而是基于项目类型,比如:

This is what you have basically done on the reader side. Now on the processing side, the processor will receive objects of type HRType, RDType and FRType. So the classifier should not be based on String as input type, but on the item type, something like:

    Map<Object, ItemProcessor> patternMap = new HashMap<>();
    patternMap.put(HRType.class, new HeaderItemProcessor());
    patternMap.put(RDType.class, new RecordItemProcessor());
    patternMap.put(FRType.class, new FooterItemProcessor());

此分类器使用 Object 类型,因为您的 ItemReader 返回原始类型.我建议在分类器中使用原始类型和Object 类型.你应该做的是:

This classifier uses Object type because your ItemReader returns a raw type. I would not recommend using raw types and Object type in the classifier. What you should do is:

  1. 为您的项目创建一个基类,并为每种类型创建一个特定的类
  2. 让阅读器返回
  3. 在您的 ClassifierCompositeItemProcessor
  4. 中使用 org.springframework.classify.SubclassClassifier

这篇关于如何为不同的记录调用适当的项目处理器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆