Die Umsetzung SkipListener zu schreiben, ungültige Datensätze zu einer flachen Datei
Ich arbeite zur Einstellung einer spring-batch-job, der die konventionelle LESEN > PROZESS - > WRITE-operation. Allerdings bin ich versucht zu implementieren eines listener-das würde zu erfassen, Datensätze, die conisdered ungültig während der PROZESS-phase und schreiben Sie es auf eine Fehler-log-Datei.
Mein listener-Klasse wird eine Instanz von FlatFileItemWriter die Daten zu schreiben. Jedoch, spring-batch ist nicht die Instanziierung der writer-Instanz ordnungsgemäß.
Mein listener-Klasse sieht wie folgt aus:
public class DTOProcessorListener extends SkipListenerSupport<AttributeReportGenerationDTO, AttributeValue> {
private static final Logger LOGGER = LoggerFactory.getLogger(DTOProcessorListener.class);
private FlatFileItemWriter<AttributeReportGenerationDTO> flatFileItemWriter;
@Override
public void onSkipInProcess(AttributeReportGenerationDTO item, Throwable t) {
try {
LOGGER.error("Record not processed for attribute value with ID : " + item.getAttributeValueId());
List<AttributeReportGenerationDTO> list = new ArrayList<AttributeReportGenerationDTO>();
list.add(item);
flatFileItemWriter.write(list);
} catch (Exception e) {
LOGGER.error("Unable to write to the error output file", e);
}
}
/**
* @param flatFileItemWriter
* the flatFileItemWriter to set
*/
public void setFlatFileItemWriter(FlatFileItemWriter<AttributeReportGenerationDTO> flatFileItemWriter) {
this.flatFileItemWriter = flatFileItemWriter;
}
}
mein und job-Konfiguration-XML sieht wie folgt aus:
<bean id="skipListener" class="something.DTOProcessorListener" scope="step">
<property name="flatFileItemWriter">
<bean id="errorItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<property name="resource" value="file:#{jobParameters['error.filename']}" />
<property name="appendAllowed" value="true" />
<property name="lineAggregator">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<property name="fieldExtractor">
<bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<property name="names"
value="productTypeId, productTypeName, productId, productName, skuId, skuName, attributeValueId, attributeName, attributeValue, attributeType, nonEditableValueCheckSum, editableValueCheckSum" />
</bean>
</property>
</bean>
</property>
<property name="headerCallback">
<bean class="something.CsvHeaderImplementation">
<property name="headerString"
value="Product Type ID,Product Type,Product ID,Product Name,Sku ID,Sku Name,Attribute Value ID,Attribute Name,Attribute Value,Attribute Type,Check Sum 1,Check Sum 2" />
</bean>
</property>
</bean>
</property>
</bean>
Bekomme ich die Fehlermeldung
org.springframework.batch.item.WriterNotOpenException: Writer must be open before it can be written to
Ich bin nicht dazu in der Lage einen stream-Eintrag in der job-Konfiguration als die Bohne für FlatFileItemWriter wird intern angegeben (für den Hörer). Wenn ich abean außerhalb der Zuhörer und beziehen sich auf Sie, seine Rückkehr eine proxy-Instanz von der FlatFileItemWriterClass.
Hat jemand erfolgreich verdrahtet Schriftsteller zu einer flachen Datei in den Hörer?
Danke für die Hilfe
InformationsquelleAutor Mahesh | 2011-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, warum nicht Sie der Verfasser als eine normale Bohne ? Sie konnte registrieren Sie es als stream und bekommen rund um die Schritt-proxy Sie verwenden könnte, die PropertPlaceholderConfigurer
erstellte ich ein funktionierendes Beispiel unter mein github repo, aber ich glaube, spring batch könnte eine Verbesserung hier, es sollte einfacher zu implementieren-Fehler-item-Protokollierung
der PPC ist für die jobParameter nicht für die Verkabelung der Bohnen, so dass Sie den Fehler.mit dem Namen richtig ersetzt
Michael, Fehler.mit dem Namen wird immer abgeholt, ordnungsgemäß in der aktuellen Konfiguration. Seine nur, dass wenn eine Instanz von flatfileitemwriter ist der erste Satz auf meiner listener Klasse, seine erstellen einer proxy-Instanz. Sind Sie darauf hindeutet, dass Ihre Lösung würde das problem lösen, ich bin mit?
die bypass - (stepscoped) proxy würde ich mit dem normalen bean-Konfiguration
dies ist, was ich getan habe... wenn ich das writer-bean nach außen und beziehen es in die listener-Klasse, spring batch, ist das erstellen einer Proxy-Instanz von der Autorin Klasse.. wenn ich das writer-Bohne als eine innere bean-der listener-Klasse, die ich nicht imstande bin, zu beziehen, um es als stream im batch:chunk-Bereich... und somit bekomme ich den "Writer geöffnet sein muss, bevor es geschrieben werden kann" Fehlermeldung.. nicht Fortschritt als ein Ergebnis von Sie..
InformationsquelleAutor Michael Pralow