Falls die Eingabedaten disjunkt zerlegt (partitioniert) werden können, so bietet sich die Möglichkeit, alle Partitionen parallel zu verarbeiten. Beispielsweise können in einer Dateiverarbeitung mehrere Eingangsdateien parallel verarbeitet werden.
Im ersten Schritt sind die Kriterien zur Partitionierung anzugeben. Ein Kriterium kann beispielsweise die Aufteilung auf mehrere Eingangsdateien sein, aber auch ein Postleitzahlrahmen, für den eine Partition innerhalb einer Adressverarbeitung zuständig ist.
Sollen Partitionen parallel verarbeitet werden, so muss die Verarbeitung der einzelnen Partitionen unabhängig voneinander sein. Allerdings bleibt im Gegensatz zur nebenläufigen Verarbeitung mittels Split ein Zusammenhang zwischen den Partitionen erhalten. Eine nebenläufige Ausführung von Steps (Split) lässt Steps unabhängig voneinander ausführen, die aus Sicht des Laufzeitsystems nichts miteinander zu tun haben (bis auf die Tatsache, dass sie synchronisiert beendet werden).
Bei der Partitionierung hingegen bleibt trotz der parallelen Verarbeitung der einzelnen Partitionen das Gesamtergebnis des Steps im Blick. Dies ist beispielsweise notwendig, wenn Sie ein Gesamtprotokoll über die Verarbeitung aller Partitionen erstellen wollen. Die partitionierte Verarbeitung bietet Mechanismen, um die Ergebnisse der einzelnen Partitionen zusammenzuführen.
Abbildung 4: Verarbeitung eines partitionierten Steps (vereinfachte Darstellung)
Partitionierung – Blick ins Innere
Die Partitionierungskriterien werden durch den Partition Plan bereitgestellt. Dieser kann entweder in der JSL konfiguriert oder aber programmatisch bereitgestellt werden. In beiden Fällen werden Properties an die Partition (bzw. die Instanz des Steps, welcher für diese konkrete Partition zuständig ist) übergeben, welche aus diesen Properties die Kriterien für die Partitionierung ableitet.
Dieses Verfahren setzt voraus, dass jede Partition ihren eigenen separaten Datenbereich besitzt, in dem die für sie spezifischen Properties bereitstehen. Tatsächlich existiert analog zum StepContext ein PartitionContext. Auch benötigt jede Partitionsverarbeitung ihre eigenen Instanzen, beispielsweise des ItemReader, ItemProcessor und ItemWriter. Daher existiert auch ein eigener Scope einer Partition, der den Lebenszyklus der Artefakte einer Partition bestimmt (siehe Scope und Lebenszyklus).
Aber wie wird der Zusammenhang zwischen den einzelnen Partitionen aufrechterhalten? Wie kann beispielsweise ein Gesamtprotokoll über alle Partitionen erstellt werden?
Dazu wird nach jeder Verarbeitung eines Chunks der aktuelle Stand der Verarbeitung für die aktuelle Partition einem sogenannten PartitionCollector bereitgestellt. Dieser sammelt die Informationen während der Verarbeitung der Partition und übergibt diese an den für alle Partitionen gemeinsamen PartitionAnalyzer. Dort werden diese Informationen zusammengeführt. Mittels dieses Mechanismus kann beispielsweise auch aus den einzelnen Protokollinformationen der Partitionen ein Gesamtprotokoll erstellt werden.
Nachdem die Verarbeitung der Partition beendet wurde, wird ihr Status an den PartitionAnalyzer übergeben (siehe Abbildung 4 – Nachbearbeitung). Dieser kann auf den Status reagieren und ggf. die gesamte Verarbeitung abbrechen.