2017-07-02 1 views
0

Im mit Spring-Boot, um meine ausgehende Batch zu schreiben, die eine der Anforderung ist zu senden und leere Datei mit Header nur, wenn es keinen Datensatz gefunden.Wie schreibe ich CSV-Datei mit leeren Körper mit Spring Batch

Ich benutze BeanPropertyRowMapper zu meinem JdbcCursorItemReader zuordnen ... warum ich BeanPropertyRowMapper verwenden, weil es viel Spalte zu zuordnen ist. Wenn ich rowmapper verwende, wird es die Hölle für mich sein, lol. dies ist die Konfiguration:

@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(); 
} 

das Problem ist, wenn myDBreader() Abfragen leer resultset zurückkehren, mein Code wird nicht auch daher myWriter myProcessor gehen.

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

meine DB-Leser:

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

kein Fehler werfen, aber wenn ich Debug-Punkt setzen, nachdem mein Leser wird es nicht überhaupt zu meinem Prozessor gehen, es Abschaltung nur die Job.

Antwort

0

Sie können FlatFileHeaderCallback implementieren, um den Header der Datei zu schreiben.

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

Einige Beispielcode FlatFileHeaderCallback zu konfigurieren. Selbst Leser liest keinen Datensatz FlatFileHeaderCallback wird aufgerufen und wird Header schreiben. letzte Datei-Header nur

@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

Die Frage ist nicht, wie man einen Header zu schreiben, ist das Problem, wenn mein Leser leer resultset zurückkehren, ich werde nicht nie zu meinem Schriftsteller gehen, in meinem Schriftsteller schon alles hat, es funktioniert Gut, wenn die Ergebnismenge nicht leer ist –

+0

gerade Leser liest keine Zeile immer noch die FlatFileHeaderCallback.writeHeader Methode wird aufgerufen. Ich habe kleines Testprogramm und meine writeHeader-Methode wird aufgerufen, selbst da sind Zeilendaten lesen und schreiben – Niraj

+0

Ok wird morgen testen und wieder aktualisieren –

Verwandte Themen