【问题标题】:how Pass file name from file reader to file writer spring batch如何将文件名从文件读取器传递到文件写入器spring批处理
【发布时间】:2018-03-18 09:35:33
【问题描述】:

我正在从文件夹中读取多个文件。假设文件名类似于 test1.txt、test2.txt、test3.txt。我想将这些文件名传递给 writer 并生成输出文件名,例如 'test1.xml' 'test2.xml' 'test3.xml。

感谢您对此的任何帮助。

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Value("classpath*:test*.txt")
private Resource[] inputFiles;

@Value("${fluent.ttrade.Location.Outbound}")
private String outPutLocation;
@Bean
public MultiResourceItemWriter<DeliveryOrder> multiResourceBlkdItemWriter() throws Exception {
    MultiResourceItemWriter<DeliveryOrder> multiWriter = new MultiResourceItemWriter<DeliveryOrder>();
    multiWriter.setDelegate(blkdItemWriter());
    String customerOutputPath = outPutLocation + "test1.xml";
    System.out.println(">> Output Path: " + customerOutputPath);
    multiWriter.setResource(new FileSystemResource(customerOutputPath));
    return multiWriter;
}


@Bean
public MultiResourceItemReader<trade> multiResourceBlkdItemReader() {
    MultiResourceItemReader<trade> reader = new MultiResourceItemReader<trade>();
    reader.setDelegate(blkdItemReader());
    reader.setResources(inputFiles);
    return reader;
}

@Bean
public FlatFileItemReader<trade> blkdItemReader() {
    FlatFileItemReader<trade> reader = new FlatFileItemReader<>();

    DefaultLineMapper<trade> customerLineMapper = new DefaultLineMapper<>();

    FixedLengthTokenizer tokenizer = new FixedLengthTokenizer();
    tokenizer.setNames(new String[] { "recordType"});
    tokenizer.setColumns(new Range[] { });

    customerLineMapper.setLineTokenizer(tokenizer);
    customerLineMapper.setFieldSetMapper(new MYFieldSetMapper());
    customerLineMapper.afterPropertiesSet();

    reader.setLineMapper(customerLineMapper);

    return reader;
}

@SuppressWarnings("deprecation")
@Bean
public CustomStaxEventItemWriter<order> blkdItemWriter() throws Exception {

    //some code here

    itemWriter.setHeaders(listHeaders);
    itemWriter.setMarshaller(marshaller);
    itemWriter.setRootTagName("blkdFile");
    itemWriter.setFooterCallback(blkdFooterCallBack());
    itemWriter.afterPropertiesSet();
    return itemWriter;
}

@Bean
public BlkdFooterCallBack blkdFooterCallBack() {
    BlkdFooterCallBack callback = new BlkdFooterCallBack();
    return callback;
}

@Bean
public BlkdItemProcessor blkdItemProcessor() {
    return new BlkdItemProcessor();
}

@Bean
public JobExecutionListener listener() {
    return new EtradeResultJobListener();
}

@Bean
public Step step1() throws Exception {
    return stepBuilderFactory.get("step1")
            .<trade, order> chunk(2000)
            .reader(multiResourceBlkdItemReader())
            .processor(blkdItemProcessor())
            .writer(multiResourceBlkdItemWriter())
            .listener(blkdFooterCallBack())
            .build();
}

@Bean
public Job job() throws Exception {
    return jobBuilderFactory.get("job")
            .start(step1())
            .listener(listener())
            .build();
}

当前使用我的配置,我正在将所有测试文件写入单个 xml。请建议我生成多个文件的配置。

【问题讨论】:

标签: xml spring spring-boot spring-batch


【解决方案1】:

Spring Batch 有一个名为ResourceAware 的接口。其中,当使用MultiResourceItemReader时,如果返回的项目实现了该接口,我们将注入项目来自的资源。这使您可以获取有关该项目来自哪个文件所需的所有信息。您可以在此处的 javadoc 中阅读有关此接口的更多信息:https://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/ResourceAware.html

【讨论】:

  • 谢谢 Michel,我已经实现了 ResourceAware 接口 Trade Object。我在 multiReourceWriter 类的 setResourceToDelegate() 方法中得到 NullPointerException,因为我得到 null 作为资源。如何为 MultiResourceItemWriter 设置资源名称。我需要一个与输入文件示例相同的输出文件名:输入文件 test.txt 输出文件 test.xml
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多