Transaktionen und Scheduler

Der Scheduler führt eine Task standardmäßig in einer einzigen globalen Transaktion aus. Mit der Servicequalität QOS_ONLYONCE oder QOS_ATLEASTONCE können Sie festlegen, ob die Task einmal als einzelne Arbeitseinheit oder als unabhängige Transaktionen ausgeführt werden soll.

Transaktionsverhalten beim Ausführen einer Task

Da der Scheduler eine Task standardmäßig in einer einzigen globalen Transaktion ausführt, bleibt die Transaktion geöffnet, bis die Task abgeschlossen ist oder fehlschlägt. Für die an dieser Transaktion beteiligten Ressourcen sind verschiedene Zeitlimits definiert. Der Thread der Task kann als blockiert erkannt werden, wenn für die Ausführung der Task ein längerer Zeitraum (mehrere Minuten oder Stunden) benötigt wird.

QOS_ONLYONCE

Geplante Tasks werden nur einmal ausgeführt, wenn Sie die Servicequalität QOS_ONLYONCE verwenden. Dazu wird die gesamte in der Task ausgeführte Arbeit zu einer einzigen Arbeitseinheit zusammengefasst. Wenn die einzelnen Tasks ausgelöst werden, treten die folgenden Ereignisse in einem einzigen globalen Transaktionskontext ein:
  1. Der Kontext der Anwendung, die die Task erstellt hat, wird auf den Thread angewendet.
  2. Ein globaler Transaktionskontext wird gestartet.
  3. Die nächste Auslösezeit und Start-by-Zeit werden mit der UserCalender-Bean bzw. dem DefaultUserCalendar berechnet.
    Wichtig: Wenn Sie die Methode TaskInfo.setTaskExcecutionOptions mit der Option TaskInfo.EXECUTION_DELAYEDUPDATE verwenden, wird dieser Schritt nach der Aktualisierung des Datensatzes ausgeführt.
  4. Der Taskdatensatz der Taskdatenbank wird in der Datenbank aktualisiert und erhält den Status der nächsten Task bzw. wird gelöscht, wenn die Task abgeschlossen und die Taskeinstellung für automatische Bereinigung aktiviert ist.
  5. Der Datenbanksatz für die Task wird in der Datenbank aktualisiert und erhält den Status der nächsten Task bzw. wird gelöscht, wenn die Task abgeschlossen und die Taskeinstellung für automatische Bereinigung aktiviert ist. Wenn Sie die Option EXECUTION_DELAYEDUPDATE verwenden, enthält die Datenbank nicht den Folgestatus der Task, sondern den aktuellen Status mit TaskStatus.RUNNING.
  6. Wenn die Bean NotificationSink definiert ist, wird die Benachrichtigung FIRING ausgelöst.
  7. Das Objekt BeanTaskInfo oder MessageTaskInfo wird gestartet.
  8. Wenn die Task fehlschlägt und die NotificationSink-Bean definiert ist, wird die Benachrichtigung FIRE_FAILED in einer separaten Transaktion ausgelöst.
  9. Wenn die NotificationSink-Bean der Task definiert ist, werden die verschiedenen Benachrichtigungen wie erfordert ausgelöst.
  10. Wenn Sie die Option EXECUTION_DELAYEDUPDATE für die Task verwenden, wird die Datenbank ein zweites Mal mit dem Folgestatus der Task aktualisiert.
  11. Die globale Transaktion wird festgeschrieben.
Da alle Ereignisse der Task in einem einzigen globalen Transaktionskontext ausgeführt werden, müssen Sie die folgenden Punkte berücksichtigen, um Fehler hinsichtlich der Transaktion zu vermeiden:
  • Alle Ressourcen, die an der Transaktion der Task beteiligt sind, müssen XA-fähig (zweiphasig) sein.

    Dies umfasst die für den Scheduler konfigurierte JDBC-Datenquelle, alle von den MessageTaskInfo-Objekten verwendeten JMS-Services und alle Ressourcen, die in einer UserCalendar-, TaskHandler- oder NotificationSink-Bean, die die Transaktionseinstellung "Required" hat, verwendet wurden.

  • Eine Ressource kann einphasig sein, wenn für die Anwendung, die die Transaktion erstellt hat, die Unterstützung für den letzten Teilnehmer aktiviert ist. Aktivieren Sie die Unterstützung für den letzten Teilnehmer mit einem Assembliertool. Sie können die Unterstützung des letzten Teilnehmers auch mit der Administrationskonsole aktivieren. Nähere Einzelheiten finden Sie im Artikel "Einstellungen für die Unterstützung des letzten Teilnehmers".

Alle unerwarteten Ausnahmen werden im Aktivitätsprotokoll protokolliert und alle Ereignisse, die an der globalen Transaktion beteiligt sind, werden zurückgesetzt. Dies umfasst Änderungen am Taskdatenbanksatz, die bewirken, dass die Task erneut ausgeführt wird, wenn der Schedulerdämon die Datenbank während des nächsten Abfragezyklus abfragt. Die UserCalendar-, TaskHandler- und NotificationSink-Beans können festlegen, dass keine Beteiligung an der globalen Transaktion erfolgen soll. Dazu muss die Transaktionseinstellung der Bean auf "Erfordert neue(n)" gesetzt werden.

QOS_ATLEASTONCE

Geplante Tasks, die die Servicequalität QOS_ATLEASTONCE verwenden, haben nicht nur einen Transaktionskontext. In diesem Fall wird jede Kalenderberechnung, Ereignisbenachrichtigung oder Datenbankaktualisierung in einer unabhängigen Transaktion durchgeführt:
  1. Der Kontext der Anwendung, die die Task erstellt hat, wird auf den Thread angewendet.
  2. Der Datenbanksatz der Task wird mit dem Laufstatus der Task aktualisiert.
  3. Die Beans UserCalendar und NotificationSink werden aufgerufen.
  4. Das Objekt BeanTaskInfo oder MessageTaskInfo wird gestartet.
  5. Es werden Ergebnisbenachrichtigungen gesendet.
  6. Die Datenbank wird mit dem Folgestatus der Task aktualisiert, wenn die Task nach dem Schreiben des Laufstatus nicht mehr geändert wurde.

Wenn nach dem Schreiben des Laufstatus in die Datenbank und vor dem Schreiben des Ergebnisses ein Fehler auftritt, kann die Task mehr als einmal ausgeführt werden.

Wenn Sie QOS_ATLEASTONCE verwenden, dürfen die Beans NotificationSink, UserCalendar und TaskHandler keine Transaktion (TX_MANDATORY) als verbindlich festlegen, da bei der Ausführung der Task keine globale Transaktion verfügbar ist. Die EJB-Komponenten verwenden "Erforderlich" oder "Erfordert neue(n)" für containergesteuerte oder Bean-gesteuerte Transaktionen.

Transaktionsverhalten bei der Verwendung von Scheduler-API-Methoden oder WASScheduler-MBean-Operationen

Alle Methoden des Interface Scheduler sind an einem einzigen globalen Transaktionskontext beteiligt. Wenn bei Ausführung der Methoden create(), suspend(), resume(), cancel() und purge() bereits ein globaler Transaktionskontext im Thread vorhanden ist, wird die vorhandene globale Transaktion verwendet. Andernfalls beginnt eine neue globale Transaktion.

Wenn die Methode an der globalen Transaktion des Aufrufenden beteiligt ist und ein unerwarteter Fehler auftritt, wird die Transaktion für das Zurücksetzen markiert. Wenn die Ausnahme deklariert wurde, wird sie zurück an den Aufrufenden übergeben, und nur der Aufrufende kann entscheiden, ob die Transaktion festgeschrieben oder zurückgesetzt wird.

Wenn die Methode eine eigene globale Transaktion startet und eine Ausnahme eintritt, wird die Transaktion zurückgesetzt und die Ausnahme zurück an den Aufrufenden übergeben.


Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=csch_tasktransaction
Dateiname:csch_tasktransaction.html