2017-10-06 88 views
0

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

+0

你可以参考https://bigzidane.wordpress.com/2016/09/12/spring-batch-partitionerreaderprocesorwriterhibernateintellij/ 在这个例子中,我们存储的文件名ExecutionContext,所以你可以重用它 –

+0

https://stackoverflow.com/questions/24623254/flatfileitemwriter-should-write-output-file-named-same-as-input-file https://stackoverflow.com/questions/ 24817659/spring-batch-passing-resource-name-from-multiresourceitemreader-flatfileitem –

+0

Luca Basso Ricci,我无法尝试第二个option.we将不会有任何工作parameters.attached配置。您可以请建议如何将文件名传递给multiresorcewriter。 –

回答

0

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

+0

谢谢Michel,我实现了ResourceAware接口Trade Object.I在multiReourceWriter类的setResourceToDelegate()方法中获取NullPointerException,因为我获取的资源为null。如何设置MultiResourceItemWriter.I的资源名称需要输出文件名称与输入文件相同 例如:输入文件test.txt输出文件test.xml –