2013-04-12 56 views
3

我需要從數據庫獲取數據,並根據數據庫中給定的文件名將數據寫入文件。Spring批處理:使用動態文件名將數據寫入多個文件

這是數據是如何在數據庫中定義:

Columns --> FILE_NAME, REC_ID, NAME 
Data --> file_1.csv, 1, ABC 
Data --> file_1.csv, 2, BCD 
Data --> file_1.csv, 3, DEF 
Data --> file_2.csv, 4, FGH 
Data --> file_2.csv, 5, DEF 
Data --> file_3.csv, 6, FGH 
Data --> file_3.csv, 7, DEF 
Data --> file_4.csv, 8, FGH 

正如你看到的,基本上與數據一起的文件名是在數據庫中定義有啥SpringBatch應該做的就是讓這些數據,並把它寫在數據庫中指定的相應的文件(即,file_1.csv應該只包含3條記錄(1,2,3),file_2.csv應該只包含記錄4和5等)

是否有可能使用MultiResourceItemWriter此要求(請注意,整個文件名是動態的,需要從中檢索m數據庫)。

回答

1

我不確定,但我不認爲有一個簡單的方法來獲得這個。你可以嘗試建立自己的ItemWriter這樣的:

public class DynamicItemWriter implements ItemStream, ItemWriter<YourEntry> { 

    private Map<String, FlatFileItemWriter<YourEntry>> writers = new HashMap<>(); 

    private LineAggregator<YourEntry> lineAggregator; 

    private ExecutionContext executionContext; 

    @Override 
    public void open(ExecutionContext executionContext) throws ItemStreamException { 
     this.executionContext = executionContext; 
    } 

    @Override 
    public void update(ExecutionContext executionContext) throws ItemStreamException { 
    } 

    @Override 
    public void close() throws ItemStreamException { 
     for(FlatFileItemWriter f:writers.values()){ 
      f.close(); 
     } 
    } 

    @Override 
    public void write(List<? extends YourEntry> items) throws Exception { 
     for (YourEntry item : items) { 
      FlatFileItemWriter<YourEntry> ffiw = getFlatFileItemWriter(item); 
      ffiw.write(Arrays.asList(item)); 
     } 
    } 

    public LineAggregator<YourEntry> getLineAggregator() { 
     return lineAggregator; 
    } 

    public void setLineAggregator(LineAggregator<YourEntry> lineAggregator) { 
     this.lineAggregator = lineAggregator; 
    } 


    public FlatFileItemWriter<YourEntry> getFlatFileItemWriter(YourEntry item) { 
     String key = item.FileName(); 
     FlatFileItemWriter<YourEntry> rr = writers.get(key); 
     if(rr == null){ 
      rr = new FlatFileItemWriter<>(); 
      rr.setLineAggregator(lineAggregator); 
      try { 
       UrlResource resource = new UrlResource("file:"+key); 
       rr.setResource(resource); 
       rr.open(executionContext); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } 
      writers.put(key, rr); 
      //rr.afterPropertiesSet(); 
     } 
     return rr; 
    } 
} 

,並配置它作爲一個作家:

<bean id="csvWriter" class="com....DynamicItemWriter"> 
     <property name="lineAggregator"> 
     <bean 
     class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> 
      <property name="delimiter" value=","/> 
      <property name="fieldExtractor" ref="csvFieldExtractor"/> 
     </bean> 
    </property> 
+0

吉爾斯感謝你的答案和時間。由於這種複雜的需求,我放棄了爲我的需求定製框架,所以我使用一個簡單的tasklet來處理文件寫入部分(當然,重新開始批量作業很具挑戰性) – forumuser1

相關問題