2016-08-15 3 views
0

Ich habe das folgende Domänenobjekt. Dies ist das Objekt, das von meinem Prozessor an meinen Schreiber übergeben wird.Neue Ausgabedatei für jedes Element, das an FlatFileItemWriter übergeben wurde

public class DivisionIdPromoCompStartDtEndDtGrouping { 

    private int divisionId; 
    private Date rpmPromoCompDetailStartDate; 
    private Date rpmPromoCompDetailEndDate; 
    private List<MasterList> detailRecords = new ArrayList<MasterList>(); 

würde ich eine neue Datei per DivisionIdPromoCompStartDtEndDtGrouping mögen. Jede Datei würde eine Zeile für jedes der detailRecords in der Liste haben. Die Ausgabedateien würden dasselbe Format haben, das nur logisch basierend auf Daten getrennt ist (divisionId, rpmPromoCompDetailStartDate und rpmPromoCompDetailEndDate).

Wie kann ich einen FlatFileItemWriter erstellen, um eine neue Datei für jede DivisionIdPromoCompStartDtEndDtGrouping mit dem Inhalt detailRecords auszugeben?

Ich denke, die Antwort könnte ein CompositeItemWriter sein. Ist das richtig? Könnte mir jemand mit einem Beispiel dafür helfen.

Dank im Voraus

Antwort

1

Sie sind in der Nähe. Verwenden Sie anstelle von CompositeItemWriter einen . In Verbindung mit einer Classifier Implementierung, die einen Writer durch Gruppierung auswählt, können Sie eine Datei pro Gruppe haben. Sie können mehr über diese ItemReader im Javadoc hier lesen: http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html

+0

danke. Ich habe mein Ziel mit einem ClassifierCompositeItemWriter erreicht. Beispiele für die Verwendung dieser Klasse mit Java Config zu finden, war wirklich schwer zu finden. Kann mir jemand mehr Java Config Beispiele zeigen. – Richie

0

Nein, ist die Antwort nicht ein zusammengesetzter Schriftsteller. Ein Composite-Writer leitet einfach alle empfangenen Items an alle definierten Childwriter weiter.

Das Problem mit FlatFileItemWriter ist, dass Sie sie öffnen und schließen müssen, was von Framwork selbst erledigt wird.

Ein einfacher Ansatz wäre, Ihren eigenen Schreiber zu implementieren und einen FlatFileWriter in seiner Schreibmethode zu verwenden.

public class MyWriter implements ItemWriter<..>{ 

    public void write(List<..> items) { 
    for (.. item:items) { 
     FlatFileItemWriter fileWriter = new FlatFileItemWriter(); 
     fileWriter.setResource(...); // unique FileName 
     fileWriter.setLineAggregator(...); 
     fileWriter.... ; // do other settings if necessary 
     fileWriter.afterPropertiesSet(); 

     fileWriter.open(new ExecutionContext()); 

     fileWriter.write(Collections.singleList(item)); 

     fileWriter.close(); 
    }  
    } 
} 

Die lineAggregator hat einen entsprechenden String einschließlich aller Zeilenumbrüche zu erstellen, so dass everyDetail in einer eigenen Zeile in die Datei geschrieben wird.

Natürlich müssen Sie keinen FlatFileWriter verwenden und nur eine Datei öffnen, verwenden Sie den lineAggregator, um die Zeile zu erstellen und die Zeile in der Datei zu speichern.

Verwandte Themen