Gibt mehrere Elemente aus dem Spring Batch ItemProcessor zurück

9

Ich schreibe einen Spring Batch Job und in einem meiner Schritte habe ich den folgenden Code für den Prozessor:

%Vor%

Der obige Code funktioniert, aber ich habe herausgefunden, dass es einige Randfälle gibt, wo mehr als ein Account pro NewsletterSubscriber erlaubt ist. Also muss ich den Statuscheck entfernen und mehr als ein Account an den Objektschreiber übergeben.

Eine Lösung, die ich gefunden habe, ist, sowohl ItemProcessor als auch ItemWriter so zu ändern, dass sie mit List<Account> type anstatt mit Account umgehen, aber das hat zwei Nachteile:

  • Code und Tests sind aufgrund von verschachtelten Listen in writer
  • hässlicher und schwerer zu schreiben und zu warten
  • Am wichtigsten ist, dass mehr als ein Account -Objekt in derselben Transaktion geschrieben werden kann, da eine dem Writer zugewiesene Liste mehrere Accounts enthalten kann, und das möchte ich vermeiden.

Gibt es eine Möglichkeit, vielleicht einen Listener zu verwenden oder eine interne Komponente zu ersetzen, die von Spring Batch verwendet wird, um Listen im Prozessor zu vermeiden?

Aktualisieren

Ich habe ein Problem mit Spring Jira für dieses Problem geöffnet.

Ich schaue mir isComplete und getAdjustedOutputs Methoden in FaultTolerantChunkProcessor , die als Erweiterungspunkte in SimpleChunkProcessor um zu sehen, ob ich sie in irgendeiner Weise nutzen kann, um mein Ziel zu erreichen.

Jeder Hinweis ist willkommen.

    
Fabio 02.06.2014, 23:37
quelle

3 Antworten

3

Es gibt keine Möglichkeit, mehr als einen Artikel pro Aufruf an einen ItemProcessor in Spring Batch zurückzugeben, ohne dabei weit in die Unkräuter zu gelangen. Wenn Sie wirklich wissen möchten, wo die Beziehung zwischen ItemProcessor und ItemWriter existiert ( nicht empfohlen ), werfen Sie einen Blick auf die Implementierungen der Schnittstelle ChunkProcessor . Während der einfache Fall ( SimpleChunkProcessor ) nicht so schlecht ist, wenn Sie eine der fehlertoleranten Logik verwenden (Überspringen / Wiederholen über FaultTolerantChunkProcessor ), wird es sehr unhandlich schnell.

Eine viel einfachere Option wäre, diese Logik in ein ItemReader zu verschieben, das diese Anreicherung durchführt, bevor das Element zurückgegeben wird. Umbrechen Sie den Wert ItemReader , den Sie verwenden, in einer benutzerdefinierten ItemReader -Implementierung, die die Dienstsuche vor dem Zurückgeben des Elements durchführt. In diesem Fall würden Sie, anstatt eine NewsletterSubscriber vom Leser zurückzugeben, eine Account basierend auf den vorherigen Informationen zurückgeben.

    
Michael Minella 03.06.2014 00:13
quelle
3

Der Objektprozessor nimmt eine Sache auf und gibt eine Liste zurück

%Vor%

Wickeln Sie den nachgeschalteten Writer ein, um Dinge auszubügeln. Auf diese Weise müssen die Dinge, die hinter diesem Writer liegen, nicht mit Listen arbeiten.

%Vor%     
Matt Broekhuis 26.02.2016 05:08
quelle
1

Anstatt einen Account zurückzugeben, den Sie zurückgeben, erstellen Sie einen AccountWrapper oder eine Collection. Der Schreiber muss dies natürlich berücksichtigen:)

    
Esben 23.01.2015 11:27
quelle