2013-04-12 4 views
3

데이터베이스에서 데이터를 가져와 데이터베이스에 지정된 파일 이름을 기반으로 파일에 데이터를 쓰도록 요구했습니다. 보시다시피, 기본적으로 데이터와 함께 파일 이름은 데이터베이스에 정의되어스프링 배치 : 동적 파일 이름을 사용하여 여러 파일에 데이터 쓰기

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가해야 할 일이 데이터를 얻고 그것을 쓰기입니다 :

이 데이터가 데이터베이스에 정의하는 방법이다 데이터베이스에 지정된 해당 파일에

이 가능이 요구 사항에 대한 MultiResourceItemWriter을 사용하는 것입니다 (즉, file_1.csv는 3 개 기록 (1,2,3), file_2.csv는 등의 기록을 4와 5를 포함한다을 포함한다) (전체 파일 이름은 동적이며 이따금 검색해야합니다. m 데이터베이스).

답변

1

잘 모르겠지만 쉽게 얻을 수있는 방법이 없다고 생각합니다.

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; 
    } 
} 

및 작가로 구성 :이 같은 자신의 ItemWriter를 구축을 시도 할 수

<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

감사합니다 질을 답변 및 시간. 본질적으로 이러한 복잡한 요구 사항 때문에 필자는 자신의 필요에 맞는 프레임 워크를 사용자 정의하는 것을 포기했습니다. 대신 간단한 작업 목록을 사용하여 파일 쓰기 부분을 처리했습니다 (물론 일괄 작업을 다시 시작하는 것은 어렵습니다) – forumuser1

관련 문제