MDBs - Transaktionsbehandlung mit dem Service Integration Bus
Message-driven Beans (MDBs) können Nachrichten an Ziele (oder Endpunkten) innerhalb des Geltungsbereichs einer Transaktion steuern.
Basierend auf der gewählten Einstellung für den MDB-Implementierungsdeskriptor sind drei Fälle möglich: containergesteuerte Transaktion (erforderlich), containergesteuerte Transaktion (nicht unterstützt) und Bean-gesteuerte Transaktion.
In den Einstellungen des MDB-Implementierungsdeskriptors können Sie festlegen, ob die Message-driven Bean ihre eigenen Transaktionen verwaltet (Bean-gesteuerte Transaktion) oder ob der Container die Transaktionen für die MDB verwaltet (containergesteuerte Transaktion). Informationen zu den Einstellungen des MDB-Implementierungsdeskriptors finden Sie in den Attributen für den MDB-Implementierungsdeskriptor. Wenn Sie sich für containergesteuerte Transaktionen entscheiden, können Sie im Notebook des Implementierungsdeskriptors für jede Methode der Bean einen Containertransaktionstyp auswählen, um festzulegen, ob Containertransaktionen erforderlich oder nicht unterstützt sind. Der Standardtyp für Containertransaktionen ist "Erforderlich".
- Containergesteuerte Transaktion (erforderlich)
In dieser Situation startet der Anwendungsserver eine globale Transaktion, bevor er vom Ziel eingehende Nachrichten liest und bevor die Methode onMessage() der MDB vom Anwendungsserver aufgerufen wird. Dies bedeutet, dass andere EJBs, die nacheinander von der Nachricht aufgerufen werden, und Interaktionen mit Ressourcen, wie z. B. Datenbanken, alle innerhalb dieser einzelnen globalen Transaktion stattfinden können, in der die eingehende Nachricht empfangen wurde.
Wenn dieser Anwendungsprozess erfolgreich ausgeführt wird, wird die globale Transaktion festgeschrieben. Wird der Prozess jedoch nicht erfolgreich ausgeführt (d. h., falls die Transaktion für Rollback (Rückgängigmachen) gekennzeichnet ist oder falls eine Laufzeitausnahme eintritt), dann wird die Transaktion rückgängig gemacht und die eingehende Nachricht wird an das MDB-Ziel zurückgegeben.
- Containergesteuerte Transaktion (nicht unterstützt)
In dieser Situation gibt es offensichtlich keine globale Transaktion, aber der JMS-Provider kann trotzdem eine Nachricht in einer Arbeitseinheit von einem MDB-Ziel an den Anwendungsserver übermitteln. Sie können dies als lokale Transaktion betrachten, weil keine anderen Ressourcen innerhalb des Transaktionsbereichs beteiligt sind.
Der Anwendungsserver bestätigt die Nachrichtenübermittlung bei erfolgreicher Zuteilung von onMessage() der Message-driven Bean (unter Verwendung des Bestätigungsmodus, der vom Assembler der Message-driven Bean angegeben wird).
Der Anwendungsserver gibt jedoch keine Bestätigung aus, wenn die Methode onMessage() eine ungeprüfte Ausnahme auslöst. Wird die Nachricht also an das MDB-Ziel zurückgegeben (oder wird sie bestätigt und gelöscht)?
Die Antwort auf diese Frage ist abhängig davon, ob der WebSphere MQ-JMS-Provider einen Synchronisationspunkt verwendet und sie kann je nach Betriebsumgebung verschieden ausfallen (insbesondere die Betriebsumgebung z/OS kann hier ein abweichendes Verhalten verursachen).
Wenn Ihr JMS-Provider in diesem Fall einer containergesteuerten Transaktion (nicht unterstützt) einen Synchronisationspunkt um den MDB-Nachrichtenkonsum erstellt, wird die Nachricht nach einer ungeprüften Ausnahme an das Ziel zurückgegeben.
Wird kein Synchronisationspunkt verwendet, wird die Nachricht nach einer ungeprüften Ausnahme am Ziel gelöscht.
Zugehörige Informationen finden Sie im technischen Hinweis "MDB behavior is different on z/OS than on distributed when getting nonpersistent messages within syncpoint" unter http://www.ibm.com/support/docview.wss?uid=swg21231549.
- Bean-gesteuerte Transaktion
Dieser Fall ist dem Fall der containergesteuerten Transaktion (nicht unterstützt) ähnlich. Obwohl in diesem Fall eine Benutzertransaktion vorliegen kann, beinhaltet eine Benutzertransaktion, die innerhalb von onMessage() der Message-driven Bean gestartet wird, nicht den Konsum der Nachricht vom MDB-Ziel im Transaktionsbereich. Verwenden Sie in diesem Fall das Szenario der containergesteuerten Transaktion (erforderlich).