Dateiverarbeitung auf zwei verschiedenen Maschinen mit Spring Batch

9

Mein Dateiverarbeitungsszenario ist

%Vor%

aber ich muss zwei physikalisch verschiedene Maschinen haben, die mit einem Speicherbereich verbunden sind, wo ich alle Eingabedateien und einen Datenbankserver erhalte. Es gibt zwei Anwendungsserver, die auf diesen Maschinen laufen (1 auf jedem Server).

Wie kann ich Spring Batch verwenden, um Eingabedateien auf diesen beiden Anwendungsservern parallel zu verarbeiten? Ich meine, wenn es 10 Dateien die 5 auf Server1 (P1) und 5 auf (P2) gibt, kann es getan werden?

    
neel.1708 02.05.2013, 12:18
quelle

4 Antworten

4

Sie könnten einen Job pro Eingabedatei planen (der Speicherort der Eingabedatei wäre ein Parameter des Jobs). Spring Batch garantiert, dass keine Jobinstanzen mit den gleichen Jobparametern erstellt werden. Sie erhalten JobExecutionAlreadyRunningException oder JobInstanceAlreadyCompleteException , wenn der andere Knoten bereits mit der Verarbeitung der gleichen Datei begonnen hat.

    
Jimmy Praet 18.02.2015 10:29
quelle
1

Zuerst sollten Sie entscheiden, ob Sie die Dateien tatsächlich teilen wollen (5 und 5), oder möchten Sie, dass jeder Server bis zum Ende verarbeitet wird? Wenn die Dateien verschiedene Größen haben mit einigen kleinen und anderen größeren, können Sie optimale Parallelisierung mit 6 auf einem Server und 4 auf dem anderen, oder 7 und 3, wenn die 3 so lange dauern, wie die anderen 7 wegen der Unterschiede in der Größe.

Eine sehr rudimentäre Methode wäre eine Datenbanktabelle, die eine aktive Verarbeitung darstellen könnte. Ihr Job könnte das Verzeichnis lesen, den ersten Dateinamen abrufen und dann in die Tabelle einfügen, in der es von dieser JVM verarbeitet wurde. Wenn der Primärschlüssel der Tabelle der Dateiname ist, dann würde ein Fehler auftreten, wenn beide gleichzeitig versuchen, und einer würde erfolgreich sein. Derjenige, der den Eintrag erfolgreich in die Tabelle einfügt, gewinnt und verarbeitet die Datei. Der andere muss diese Ausnahme behandeln, die nächste Datei auswählen und versuchen, sie als Verarbeitungseintrag einzufügen. Auf diese Weise wird im Wesentlichen eine zentralisierte Sperre (in der db-Tabelle) eingerichtet, und Sie erhalten eine effizientere Verarbeitung, bei der die Dateigröße und nicht nur die Dateiverteilung berücksichtigt wird.

    
IceBox13 20.02.2015 14:59
quelle
0

Hier sind meine Vorschläge:

  • Erstellen Sie eine Sperrtabelle in db mit dem Dateipfad als Primärschlüssel. Versuchen Sie dann, einen Datensatz mit diesem Schlüssel einzufügen. Wenn dies erfolgreich ist, kann Ihr Code die Datei weiterverarbeiten und verarbeiten, falls dies fehlschlägt (Ausnahme: der Datensatz mit diesem Primärschlüssel ist vorhanden). Gehen Sie dann zur nächsten Datei.

  • genaue Planung, wie bereits von Jimmy erwähnt

  • Sie können versuchen, eine Warteschlange (wie ActiveMQ, RabittMQ, ...) zu verwenden, um Ihre Maschinen zu synchronisieren

Michal 25.02.2015 07:18
quelle
-1

Es gibt eine ziemlich einfache Art, es zu tun. Wenn ich es richtig finde, lege ich jede Datei in die Datenbank (einige Informationen darüber) und entferne sie dann, um eine neue Ausgabe zu erstellen. Sie können darauf () klicken, Bevor Sie die Datei lesen, überprüfen Sie

%Vor%

und in Bearbeitung

%Vor%

Hier finden Sie Informationen zu Sperren .

    
noOneInParticulat 16.05.2013 10:25
quelle

Tags und Links