Ausgabe
Ich verwende Spring Batch, um eine Datei mit 3 Millionen Datenzeilen zu verarbeiten. Die Datei ist wie folgt aufgebaut:
ID1-Adress1-NumberPhone1
ID1-Adress2-NumberPhone2
ID1-Adress3-NumberPhone3
ID2-Adress1-NumberPhone1
ID2-Adress2-NumberPhone2
ID3-Adress1 NumberPhone1
...
Ich muss die Datei nach ID lesen, nicht Zeile für Zeile. Zum Beispiel:
lesen
ID1-Adress2-NumberPhone2
ID1-Adress3-NumberPhone3
ID2-Adress1-NumberPhone1
ID2-Adress2-NumberPhone2
Erstellen Sie dann ein Personenobjekt mit den Attributen ID und a
Map <String, String>
(für Adresse, NummerTelefon), übergeben Sie dieses Objekt an den Prozessor, lesen Sie dann die Zeilen, die der zweiten ID zugeordnet sind, und so weiter, bis ich eine Liste von Personenobjekten habe, die ich übergeben kann Der Schriftsteller. Insbesondere muss mein Reader jedes mehrzeilige Objekt vervollständigen, bevor es an den Prozessor gesendet und bevor der Writer es in der Datenbank speichert.
Bei dem Prozess, dem ich gefolgt bin, habe ich einen Schritt erstellt, der Zeile für Zeile liest und diese Zeile dann als Objekt an den Writer weitergibt. In diesem Writer schleife ich die Objekte mit derselben ID und bilde sie in einem anderen Objekt ab (schreibe), das mein vollständig ist Objekt, dann ein zweiter Schritt, der diese endgültige Liste vollständiger Objekte nimmt, sie liest und in die Datenbank einfügt, das Problem ist, dass dieser Schritt viel Zeit in Anspruch nimmt, mehr als 2 Stunden für den ersten Schritt
Gibt es eine Methode, einen Aggregationsprozess im Reader? Ich habe versucht, dieses Beispiel https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/ mehrzeilig zu sehen, aber Ich habe überhaupt nicht verstanden, dass ich ein einfaches konkretes Beispiel brauche, indem ich mich an das Format der oben zitierten Datei anpasse
Lösung
Sie können sich das mehrzeilige Beispiel ansehen . In diesem Beispiel hat die Eingabedatei das folgende Format (das Ihrem Fall ähnlich ist):
BEGIN
INFO,UK21341EAH45,customer1
AMNT,978,98.34
END
BEGIN
INFO,UK21341EAH46,customer2
AMNT,112,18.12
END
...
Ein benutzerdefinierter Reader wird verwendet, um Elemente zu aggregieren, die sich über mehrere Zeilen erstrecken. In diesem Beispiel wird ein (logisches) Element durch BEGIN
und END
(physische) Datensätze begrenzt. Sie können sich den MultilineTradeItemReader ansehen und an Ihren Fall anpassen.
Hoffe das hilft.
Beantwortet von – Mahmoud Ben Hassine
Antwort geprüft von – Katrina (FixError Volunteer)