2016-03-22 2 views
3

Wir haben eine alte Codebasis, von der ich denke, dass sie durch die Auswahl eines guten Stapelverarbeitungs-Frameworks verbessert werden kann.Spring batch best practice in Bezug auf Daten zwischen den Schritten

Ich habe angefangen, mit Spring Batch zu experimentieren und entschied (nach dem Lesen von Dokumenten, mehreren Büchern und Foren), dass der beste Weg, um ein Gefühl davon zu bekommen ist, es tatsächlich zu verwenden, also habe ich einige unserer neu entwickelt vorhandene Apps zu Spring Batch. Hier

ist die einfache Anwendung i saniert haben:

  • lesen Zeilen aus einer Tabelle und analysieren Leitungen zu einem POJO
  • Wenn ein Geben Kriterien erfüllt ist, ignorieren Sie das Element aus der Liste
  • schreiben Sie eine Datei aus dem analysierten Liste
  • Laden Sie die Datei auf einen FTP-
  • Mark Elemente der Liste analysiert, wie in der db verarbeitet, wenn der FTP-Upload erfolgreich ist

Nun, was ich getan habe, ist ich einen einzigen Job mit 3 Schritten erstellt haben:

Schritt 1 ist: Linien zu POJO lesen (Leser, jdbc in diesem Fall basiert), Gegenstände auszuschließen (Prozessor), schreibe in Datei (writer). Einfach. :)

Schritt 2: Tasklet hochladen

Schritt 3 auf FTP: jetzt, das ist, wo ich bin in Schwierigkeiten. Ich muss die POJO-Liste von Step1 wiederverwenden.

Mein Verständnis ist, dass ich habe zwei Möglichkeiten:

1) entweder die StepExecutionContext verwendet, speichern Sie die Liste dort und eine ExecutionContextPromotionListener Implementierung die Liste zwischen Schritt 1 und Schritt 2 und Schritt 2 und Schritt 3 passieren.

oder

2) verwende ich die gleichen Leser und Prozessor und einem anderen Schreiber diese Zeit nutzen.

mir wirklich nicht gefallen Ansatz

1) scheint chaotisch und ich habe an mehreren Stellen gelesen, dass es keine gute Praxis ist etwas größer in diesem Zusammenhang zu setzen (meine Liste würde halten 5-10000 Objekte)

2) Scheint eine Verschwendung von Ressourcen und wieder eine schlechte Praxis. In diesem Szenario könnte ich damit durchkommen, aber im Fall eines komplexeren Lesers/Prozessors wäre es eine ziemlich schlechte Doppelarbeit.

Was ist der beste Weg zu tun, was ich tun möchte? Bin ich Spring Batch hier richtig?

Antwort

2

So würde ich die Arbeitsschritte strukturieren.

  1. Read: DB schreiben: File1
  2. Read: File1 Prozess: SkipFilter schreiben: File2
  3. FTP unter Verwendung von Systembefehl Tasklet
  4. Read: File1 oder File2 schreiben: DB

Ich fügte einen Schritt hinzu, um sich gegen den DB zu schützen, der sich änderte, während stromabwärts Schritte durchgeführt wurden.

+0

Ja, das ist wahrscheinlich besser als meine beiden Optionen. :) Stil, jedoch muss ich eine Datei durchlaufen, die ich zuvor erstellt habe, also wird es langsamer und ein wenig verschwenderisch. Denkst du, ich nähere mich Spring Batch überhaupt? –

+0

Noch eine Sache: ich würde nicht System Command Tasklet verwenden, das macht meinen Code abhängig von dem Server, auf dem es läuft, ich würde mein eigenes Tasklet schreiben, um FTP-Uploads zu behandeln. Aber das ist nur ein Detail :) –

1

Ich habe das Buch "Spring Batch Essentials" gelesen und sie hatten die Idee, "Halter Bohnen" zu verwenden, um die Daten zu halten. Inject die Bean zu setzen und Daten damit zu bekommen.

+0

Die einzige Sache, die ich herausfinden muss, ist, wie man diese Lösung threadsafe macht. :) –