当前位置: 首页 > 知识库问答 >
问题:

如何为不同的记录调用适当的项目处理器?

许亦
2023-03-14

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

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

    @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;
    }

共有1个答案

蔡默
2023-03-14

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

读取器根据输入模式返回特定类型的项,类似于:

  • hr*->hrtype
  • rd*->rdtype
  • fr*->frtype
    Map<Object, ItemProcessor> patternMap = new HashMap<>();
    patternMap.put(HRType.class, new HeaderItemProcessor());
    patternMap.put(RDType.class, new RecordItemProcessor());
    patternMap.put(FRType.class, new FooterItemProcessor());
    null
 类似资料:
  • 问题内容: 如何配置Logback以将记录器的不同级别记录到不同的目的地? 例如,给定以下Logback配置,Logback会将消息记录到并将消息记录到吗? (请注意,此示例是第3章:Logback配置中所示示例的变形)。 问题答案: 更新:有关使用Groovy的基于所有配置的方法,请参见DeanHiller的答案。 好的,这是我最喜欢的xml方法。我为Eclipse版本执行此操作,因此我可以 单

  • 我正在使用java-8进行多个Spring boot项目,但现在其中一个需要转移到java-11。所以我需要在笔记本电脑上安装两个版本。那么如何在同一台机器上为不同的项目处理不同的JAVA版本呢?

  • 问题内容: 我想使用Log4J记录我的Java项目。我在src目录中创建了一个log4j.properties文件,其内容如下: 例如,我只想在我的主要方法中使用“ DEFAULT_LOGGER”。所以我写道: 但是,当我执行main方法时,我将消息“ Process Logger”打印到所有Appender(stdout,file和file2),但是我只想将其打印到file2。我该怎么做,或者更

  • 问题内容: 我是批处理文件的新手。我有两个项目,我想使用批处理文件运行它们。projectA应该在端口8081上运行,而projectB应该在8082上运行。我尝试了以下两种方法,但是只有projectA在端口8081上启动。 似乎没有阅读以下部分。 我也尝试创建2个批处理文件:master.bat和slave.bat。 master.bat包含以下内容,并正在调用slave.bat: slave

  • 我正在使用AWS kinesis和lambda开发一个实时数据管道,我试图弄清楚如何确保来自相同数据生产者的记录由相同的碎片处理,并最终由相同的lambda函数实例处理。 我的方法是使用分区键来确保来自相同生产者的记录由相同的碎片处理。但是,我不能让同一碎片中的记录由同一lambda函数实例处理。 基本设置如下: null 分区键用于在流中按碎片对数据进行分组。Kinesis Data Strea

  • 我正在从事两个不同的项目,都使用不同的maven文件 当我在项目之间切换时,它会重新下载存储库文件夹中的所有maven依赖项,删除以前项目的依赖项 是否有任何方法可以使用两个,并为两个项目维护不同的存储库。