2017-07-02 18 views
0

私はバングブートを使用して、送信する必要がある送信バッチを作成し、レコードが見つからない場合にのみヘッダーで空のファイルを作成します。バーンバッチを使用して空のボディでCSVファイルを書き込む方法

私はJdbcCursorItemReaderをマップするためにBeanPropertyRowMapperを使用しています...なぜ、BeanPropertyRowMapperを使用するのは、マップする列が多いためです。もし私がrowmapperを使用しているなら、それは私のために地獄になるでしょう。 myDBreader()クエリが空の結果を返す場合

@Bean 
public Step RawDataOutBoundSteps() throws IOException { 

    return stepBuilderFactory.get("step1").<RawDataExtractionDTO, RawDataExtractionDTO>chunk(1000)//.faultTolerant() 
      //.skip(Exception.class) 
      //.skipLimit(1000) 
      .reader(myDBReader()).processor(myProcessor()) 
      .writer(myWriter()).build(); 
} 

問題がある、私のコードは文句を言わないので、またmyWriterをmyProcessorに行く:これは構成です。

myProcessor:

public class RawDataJobProcessor implements 
ItemProcessor<RawDataExtractionDTO, RawDataExtractionDTO>{ 

@Override 
public RawDataExtractionDTO process(RawDataExtractionDTO item) throws Exception { 
    System.out.println(" Raw DAta Process"); 

    if(item == null) 
    return null; 

    return item; 
}} 

私のDBリーダー:私は私の読者後にデバッグポイントを置けば

@Bean 
ItemReader<RawDataExtractionDTO> rawDataDBReader() { 

    String jobName = Application.jobName; 
    String sql_query = ""; 

    if("RawDataOutBoundweekly".equalsIgnoreCase(jobName)){ 
     log.info("=========RawDataOutBoundweekly========="); 

     sql_query = "select * from vw_rawdata_weekly"; 

    }else if("RawDataOutBoundmonthly".equalsIgnoreCase(jobName)){ 
     log.info("================RawDataOutBoundmonthly============="); 

     sql_query = "select * from vw_rawdata_monthly"; 
    } 
    log.info("ENTERING rawDataDBReader ==================="); 


    JdbcCursorItemReader<RawDataExtractionDTO> datareader = new 
    JdbcCursorItemReader<>(); 
    datareader.setSql(sql_query); 
    datareader.setDataSource(dataSource); 
    datareader.setRowMapper(new BeanPropertyRowMapper<> 
    (RawDataExtractionDTO.class)); 
    return datareader; 
} 

なしエラースローが、それは文句を言わないで、私のすべてのプロセッサに行く、それだけでシャットダウンジョブ。

答えて

0

FlatFileHeaderCallbackを実装して、ファイルのヘッダーを書き込むことができます。

http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/file/FlatFileHeaderCallback.html

FlatFileHeaderCallbackを設定するには、いくつかのサンプルコード。読者でさえレコードを読まない場合はFlatFileHeaderCallbackと呼ばれ、ヘッダを書きます。最終的なファイルは、ヘッダのみ

@Bean 
    public FlatFileItemWriter<Person> myWriter() 
    { 
     System.out.println("FlatFileItemWriter*******************"); 
     FlatFileItemWriter<Person> writer = new FlatFileItemWriter<Person>(); 
     writer.setResource(new FileSystemResource("output.csv")); 
     DelimitedLineAggregator<Person> delLineAgg = new DelimitedLineAggregator<Person>(); 
     delLineAgg.setDelimiter(","); 
     BeanWrapperFieldExtractor<Person> fieldExtractor = new BeanWrapperFieldExtractor<Person>(); 
     fieldExtractor.setNames(new String[] {"firstName", "lastName"}); 
     delLineAgg.setFieldExtractor(fieldExtractor); 
     writer.setLineAggregator(delLineAgg); 

    writer.setHeaderCallback(myFlatFileHeaderCallback);  


     return writer; 
    } 


@Component 
public class MyFlatFileHeaderCallback implements FlatFileHeaderCallback { 

    @Override 
    public void writeHeader(Writer writer) throws IOException { 
     System.out.println("Header called"); 

    } 

} 
+0

問題は私の読者は、空の結果セットを返す場合、問題は、ヘッダーを作成する方法ではありませんしているだろう、私はすでにすべてを持っている私の作家で、私の作家に行くことはありません、それが動作文句を言いません結果セットが空でない場合は細かい。 –

+0

ReadFillHeaderCallback.writeHeaderメソッドがまだ呼び出されていない場合でも、リーダーが行を読み取っていない。私は小さなテストプログラムを行い、writeHeaderメソッドが呼び出されても行データが読み書きされます – Niraj

+0

明日テストして再度更新します –

関連する問題