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.
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 –
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
Ok wird morgen testen und wieder aktualisieren –