Sie können die Tasks einer Stapelanwendung in Stapelabschnitte aufteilen.
Stapelabschnitte werden als lokale containergesteuerte
Enterprise-JavaBeans (EJB) implementiert, die die Schnittstelle
"com.ibm.websphere.batch.BatchJobStepLocalInterface" als Geschäftsschnittstelle angeben.
Stapeljobabschnitte werden nacheinander ausgeführt.
Callback-Methoden in der Schnittstelle "BatchJobStepLocalInterface" erlauben den Compute-Grid-Endpunkten, beim Ausführen
eines Stapeljobs Stapelabschnitte auszuführen.
Eine Stapelabschnitts-EJB enthält stapelfähige Geschäftslogik, die für einen
Abschnitt des Stapeljobs ausgeführt werden soll. Normalerweise enthält ein
Stapelabschnitt Code, mit dem ein Satz aus einem Stapeldatenstrom gelesen werden kann.
Dieser Satz wird verwendet, um Geschäftslogik auszuführen, anschließend wird der
nächste Satz gelesen. Die Methode "processJobStep" einer Stapelabschnitts-EJB wird von den
Compute-Grid-Endpunkten in einer Stapelschleife aufgerufen. Diese Methode enthält die gesamte
Logik, die als Stapel auf Daten angewendet werden kann.
Die Compute-Grid-Endpunkte rufen Methoden der Stapelabschnitts-EJB in einer globalen Transaktion
auf. Diese globale Transaktion wird von den Compute-Grid-Endpunkten gesteuert. Das Verhalten der
Transaktion, z. B. das Zeitlimit oder das Festschreibungsintervall für die Transaktion,
wird von dem Prüfpunktalgorithmus gesteuert, der dem Stapeljob, zu dem der Abschnitt
gehört, zugeordnet ist.
Die folgenden Callback-Methoden für
Compute-Grid-Endpunkte sind in der Schnittstelle
"BatchJobStepLocalInterface" enthalten und werden von
Compute-Grid-Endpunkten in der folgenden Reihenfolge aufgerufen:
- setProperties(java.util.Properties properties): Stellt Eigenschaften, die in
xJCL definiert sind, für Jobabschnitte in einem java.util.Properties-Objekt zur
Verfügung.
Diese Methode wird in einer globalen Transaktion aufgerufen.
- void createJobStep(): Zeigt dem Abschnitt an, dass er initialisiert
wurde. Initialisierungslogik, z. B. das Abrufen einer Kennung für einen
Stapeldatenstrom, kann hier platziert werden. Diese Methode wird in einer globalen Transaktion aufgerufen.
- int processJobStep(): Wird wiederholt von den Compute-Grid-Endpunkten in einer Stapelschleife
aufgerufen, bis der Rückkehrcode dieser Methode, der als ganze Zahl dargestellt wird,
anzeigt, dass der Abschnitt die Verarbeitung beendet hat. Sehen Sie sich "BatchConstants" in der Anwendungsprogrammierschnittstelle
für Stapeljobs an, um festzustellen, welche Rückkehrcodes zurückgegeben werden können. Der
Rückkehrcode "BatchConstants.STEP_CONTINUE" signalisiert den Compute-Grid-Endpunkten, dass sie diese Methode
in der Stapelschleife weiterhin aufrufen sollen. Der Rückkehrcode
"BatchConstants.STEP_COMPLETE" zeigt den Compute-Grid-Endpunkten an, dass der Abschnitt abgeschlossen ist, und
destroyJobStep wird aufgerufen.
- int destroyJobStep(): Zeigt dem Abschnitt die Fertigstellung an.
Der Rückkehrcode dieser Methode ist beliebig und kann vom
Entwickler der Stapelanwendung ausgewählt werden. Dieser Rückkehrcode
wird in der Datenbank der Compute-Grid-Endpunkte gespeichert und repräsentiert den Rückkehrcode des
Stapelabschnitts. Wenn der Ergebnisalgorithmus dem Stapeljob zugeordnet ist, wird dieser Rückkehrcode an ihn übergeben.
Enthält die xJCL des Stapeljobs bedingte,
auf Rückkehrcodes basierende Logik, verwenden die Compute-Grid-Endpunkte diesen Rückkehrcode, um die Logik
auszuwerten.
Die Methode "getProperties()" in der Schnittstelle "BatchJobStepLocalInterface"
wird gegenwärtig nicht von den Compute-Grid-Endpunkten aufgerufen. Die Methode
ist in der Schnittstelle für die Symmetrie und eine mögliche spätere Verwendung enthalten.
Fehlerbehebung und Stapelentwicklung
- Sie müssen den Implementierungsdeskriptor der Stapelcontroller-Bean im EJB-Implementierungsdeskriptor einer Stapelanwendung
deklarieren und lokale EJB-Referenzen in die Abschnitts-Enterprise-Bean einfügen, die in einer Stapelanwendung
verwendet wird. Pro Stapelanwendung kann nur eine Controller-Bean definiert werden.
- Setzen Sie alle Transaktionsattribute aller Stapelabschnittsmethoden auf "erforderlich".
- Der Entwickler der Stapelanwendung muss sicherstellen, dass
transaktionsorientierte Arbeiten, die in den Callback-Methoden des Stapelabschnitts ausgeführt werden,
die globale Transaktion übernehmen, die von den Compute-Grid-Endpunkten gestartet wurde.
Diese Aktion stellt sicher, dass die in einem Stapelabschnitt ausgeführten Arbeiten nur an jedem Prüfpunkt festgeschrieben
und nur rückgängig gemacht werden, wenn der ein Fehler im Abschnitt auftritt.
- Wenn der Stapelabschnitt einen Stapeldatenstrom verwendet, dessen Daten sich im
Dateisystem des lokalen Anwendungsservers befinden, in dem die Stapelanwendung implementiert wird,
müssen Sie bestimmte Schritte ausführen, um die Szenarios für den Neustart von Jobs zu unterstützen. Wenn eine solche Stapelanwendung auf Anwendungsservern
implementiert wird, die auf mehreren Systemen ausgeführt werden können - z. B. bei einer
Implementierung in einem dynamischen Cluster, der sich in einer Knotengruppe mit mehreren
Knoten-Membern befindet - und wenn ein Stapeljob, der für eine solche
Anwendung ausgeführt wird, abgebrochen und anschließend erneut gestartet wird,
gibt es keine Garantie, dass die Anforderung des Neustarts an das System gesendet wird,
auf dem der Stapeljob ursprünglich ausgeführt wurde.
In diesem Szenario wird bei der Verteilung die Anforderung des
Neustarts an einen Anwendungsserver gesendet, der auf einem anderen System ausgeführt
wird. Daher sind in den Fällen, in denen die dateibasierte Affinität erforderlich ist,
folgende Lösungen zur Unterstützung des Szenarios "Neustart des Jobs" möglich:
- Vergewissern Sie sich, dass die Daten allen Systemen, auf denen die Stapelanwendung
gestartet werden kann, zur Verfügung stehen. Verwenden Sie für dieses Beispiel ein Netzdateisystem.
Diese Aktion kann die Leistung der Anwendung beeinträchtigen.
- Implementieren Sie die Anwendung in Anwendungsservern, die nur auf der Maschine
ausgeführt werden können, auf der die lokalen Daten vorhanden sind. Führen Sie diese Aktion aus,
indem Sie die Anwendung in einem dynamischen Cluster implementieren, der sich in einer Knotengruppe
befindet, die nur einen Member-Knoten enthält.