如何将文件名从文件阅读器传递到文件编写器弹簧批处理

时间:2017-10-06 14:31:05

标签: xml spring spring-boot spring-batch

我正在从该文件夹中读取多个文件。假设文件名类似于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。请建议我生成多个文件的配置。

1 个答案:

答案 0 :(得分:0)

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