2017-10-06 22 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 –

相關問題