spring batch ItemReader FlatFileItemReader set cursor zu Lesen beginnen aus einer bestimmten Zeile oder einer Reihe linestoskip dynamisch
In meinem springbatch+Quarz-setup, ich lese eine CSV-Datei mit FlatFileItemReader. Ich möchte, um den cursor für den Leser bis zum start des nächsten jobinstance mit den gegebenen Parametern für Leser. Ist es möglich?
<bean id="cvsFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<!-- Read a csv file -->
<property name="resource" value="classpath:cvs/input/report.csv" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="names" value="id,impressions" />
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<property name="prototypeBeanName" value="report" />
</bean>
</property>
</bean>
</property>
</bean>
Die Idee ist, Lesen Sie weiter die Datei wo der Letzte Fehler auftrat in der nächsten Ausführung. Ich bin putting ein integer 'writecursor' für jede Zeile geschrieben in meinem customWriter.
public void write(List<? extends Report> items) throws Exception {
System.out.println("writer..." + items.size() + " > ");
for(Report item : items){
System.out.println("writing item id: " + item.getId());
System.out.println(item);
}
//getting stepExecution by implementing StepExecutionListener
this.stepExecution.getExecutionContext().putInt("writecursor", ++writecursor);
}
Nun, in der customItemReadListener, ich möchte das update writecursor Wert, und überspringen Sie dann die Zeilen von oben zu Lesen beginnen aus writecursor
public class CustomItemReaderListener implements ItemReadListener<Report>, StepExecutionListener {
ApplicationContext context = ApplicationContextUtils.getApplicationContext();
private StepExecution stepExecution;
@Override
public void beforeRead() {
//Skip lines somehow
}
Andere Sache, die ich sah, wie eine mögliche Lösung ist, um linestoskip dynamisch in itemreader. Es gibt einen thread hier http://thisisurl.com/dynamic-value-for-linestoskip-in-itemreader aber noch nicht geantwortet. Und hier,
http://forum.spring.io/forum/spring-projects/batch/100950-accessing-job-execution-context-from-itemwriter
- möglich, Duplikat der Spring batch job csv-Datei Lesen, erholen sich von der Linie, wo es fehlgeschlagen
- Ja, möglich duplizieren. Ich habe versucht, mit linestoskip Eigentum der Leser. Aber jetzt denke ich, intead speichern der cursor-Wert in stepexecution, die ich brauche, um es zu speichern in jobexecutioncontext als cursor-Wert wird zurückgesetzt, in den nächsten jobexecution. Wie Sie Zugang zu jobexecutioncontext in ItemReader/Processor/ - Writer?
- Check meine Antwort. Aber IMHO sind Sie nur replizieren ein SB built-in-Funktion
- Ich bin Art von versuchen, um eine benutzerdefinierte spring batch admin mit Quarz, so muss zum überschreiben der verschiedenen Szenarien und einfügen meiner eigenen Logik
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
FlatFileItemReader.linesToSkip
Eigenschaft gesetzt Injektion job-Parameter-Wert.Einen einfachen Weg für die Umsetzung der Linien, die zu überspringen ist, durch die folgenden:
erstellen Sie eine flat-file-reader-Leser in der xml-autowire den Leser auf die beforeStep der Schritt der Ausführung Hörers wie unten gezeigt
es ist in Ordnung für mich.....