繁体   English   中英

Spring Batch-用于不同分隔文件的FlatFileItemReader

[英]Spring Batch - FlatFileItemReader for different delimited files

我有两个不同的文件,一个用管道分隔符“ |”分隔 还有一个用逗号“,”。

我正在使用Spring Batch使用FlatFileItemReader处理这些文件。 我不想有两个读者和两个作家的文件。 我可以为这两个文件使用一个通用的FlatFileItemReader吗?

文件将映射到的对象也不同。

您可以注入DelimitedLineTokenizer,并可以根据需要设置定界符。 您可以使用StepExecutionListener使其通用,并需要覆盖beforeStep()方法。 您将在StepExecution中设置定界符。 当您解析“,”文件时,则分别分隔stepExecution.getExecutionContext()。putString(“ delimiter”,“,”); 当文件以“ |”分隔时 然后stepExecution.getExecutionContext()。putString(“ delimiter”,“ |”);

但是您需要创建两个作业。 需要相应地指定监听器。

您可以在Walking Techie上的Spring Batch中看到上面解释逻辑的示例
通用阅读器的代码:

@Bean
  @StepScope
  public FlatFileItemReader<Domain> reader(@Value("#{stepExecutionContext[delimiter]}") String delimiter) {
    FlatFileItemReader<Domain> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("sample-data.csv"));
    reader.setLineMapper(new DefaultLineMapper<Domain>() {{
      setLineTokenizer(new DelimitedLineTokenizer() {{
        setNames(new String[]{"id", "name"});
        setDelimiter(delimiter);
      }});
      setFieldSetMapper(new BeanWrapperFieldSetMapper<Domain>() {{
        setTargetType(Domain.class);
      }});
    }});
    return reader;
  }

您可以从Spring Batch Tutorial中的spring boot中找到有关spring batch的许多示例。 您将在这里找到与弹簧批处理有关的所有问题。

您可以将DelimitedLineTokenizer注入FlatFileItemReader并将其定界符值设置为它。 XML配置的相关部分如下

<bean id="pipeDelimitedFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
    ...
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <property name="lineTokenizer">
                <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    ...
                    <property name="delimiter" value="|"/>
                </bean>
            </property>
            ...
        </bean>
    </property>
    ...
</bean>

例如,您可以类似地配置另一个commaDelimitedFileItemReader bean(逗号实际上是DelimitedLineTokenizer的默认分隔符值)

我已经在Spring Boot中创建了一个示例Spring Batch程序,该程序将创建两个作业,一个作业将处理以逗号分隔的CSV文件中的数据读取,其他作业将以竖线分隔的CSV文件中的数据读取(“ | ”)。 这两个作业都使用相同的通用FlatFileItemReader从CSV文件读取数据,并使用MongoItemWriter将数据写入MongoDB。

您可以在Spring Boot的Spring Batch示例中找到说明和工作代码-带有与Mongo数据库不同的分隔符的CSV文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM