MDBs - Transaktionsunterstützung
Message-driven Beans (MDBs) können Nachrichten an Ziele (oder Endpunkten) innerhalb des Geltungsbereichs einer Transaktion steuern.
Transaktionsbehandlung bei der Verwendung des Nachrichten-Listener-Service mit IBM MQ JMS
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). 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).
Erneute Zustellung der Nachricht
In jedem der drei vorhergehenden Fälle wird eine Nachricht an das MDB-Ziel zurückgegeben und eventuell erneut zugeteilt. Falls die ursprüngliche Rückgabe aufgrund eines temporären Systemfehlers erfolgte, sollte die erneute Zuteilung der Message-driven Bean mit dieser Nachricht erfolgreich sein. Wenn die Rückgabe jedoch aufgrund eines bestimmten Fehlers im Zusammenhang mit der Nachricht erfolgte, würde die Nachricht wiederholt zurückgegeben und erneut zugeteilt werden. In diesem Szenario wird eine falsch formatierte Nachricht (Poison Message) verwendet.
Der Anwendungsserver geht in einem solchen Szenario so vor, dass er die Häufigkeit überwacht, mit der eine Nachricht zugestellt wird, und den zugehörigen Listener-Port stoppt, sobald eine angegebene Anzahl an erneuten Zustellungen erreicht wird.
- Maximale Anzahl Wiederholungen
- Der Parameter Maximale Anzahl Wiederholungen gibt an, wie oft der Listener versucht, eine bestimmte Nachricht einer MDB-Instanz zuzustellen, bevor der Listener gestoppt wird.
- Wenn Sie diesen Parameter auf 0 setzen, stellt der Listener die Zustellung nach dem ersten misslungenen Nachrichtenzustellversuch ein.
Wenn Ihr Messaging-System Aktivierungsspezifikationen verwendet, wird das Szenario mit falsch formatierten Nachrichten etwas anders behandelt. Während Listener-Ports verfolgen, wie oft die Zustellung einer bestimmten Nachricht fehlgeschlagen ist und wiederholt wurde, zählen Aktivierungsspezifikationen die Anzahl aufeinanderfolgender Nachrichenzustellungsfehler.
- Endpunkte bei wiederholten Nachrichtenfehlern automatisch stoppen
- Sie müssen sicherstellen, dass diese Option ausgewählt ist.
- Diese Eigenschaft setzt die Nachrichtenzustellung an den Endpunkt aus, wenn der Schwellenwert für aufeinanderfolgende Nachrichtenfehler erreicht ist.
- Schwellenwert für aufeinanderfolgende Nachrichtenfehler
- Dieser Parameter bestimmt, wie viele Nachrichtenzustellungen fehlschlagen können, bevor die Nachrichtenzustellung ausgesetzt wird.
- Zum Aktivieren dieses Parameters muss die Option Endpunkte bei wiederholten Nachrichtenfehlern automatisch stoppen ausgewählt werden.
- Verzögerung zwischen Wiederholungen fehlerhafter Nachrichten
- Dieser Parameter gibt an, wie viel Zeit vergehen muss, bevor eine Nachricht, die nicht erfolgreich zugestellt werden konnte, erneut zugestellt wird.
- Wenn Sie 0 für diesen Parameter angeben, gibt es vor der erneuten Zustellung einer Nachricht keine Verzögerung.
- Zum Aktivieren dieses Parameters muss die Option Endpunkte bei wiederholten Nachrichtenfehlern automatisch stoppen ausgewählt werden.
- Endpunkt stoppen, wenn Nachrichtenzustellung fehlschlägt
- Sie müssen sicherstellen, dass diese Option ausgewählt ist.
- Diese Eigenschaft setzt die Nachrichtenzustellung an den Endpunkt aus, wenn die Anzahl sequenzieller Zustellungsfehler vor dem Aussetzen des Endpunkts erreicht ist.
- Anzahl sequenzieller Zustellungsfehler vor dem Aussetzen des Endpunkts
- Dieser Parameter bestimmt, wie viele Nachrichtenzustellungen fehlschlagen können, bevor die Nachrichtenzustellung ausgesetzt wird.
- Zum Aktivieren dieses Parameters müssen Sie die Option Endpunkt stoppen, wenn Nachrichtenzustellung fehlschlägt auswählen.
Alternativ können Sie zur Behebung des Problems IBM MQ konfigurieren, anstatt sich darauf zu verlassen, dass der Anwendungsserver den Listener-Port oder die Aktivierungsspezifikation stoppt, wenn eine falsch formatierte Nachricht erkannt wird. Geben Sie für Warteschlangenziele eine Rücksetzwarteschlange (BOQUEUE) und einen Grenzwert für Zurücksetzen (BOTHRESH) im Warteschlangenobjekt in IBM MQ an. Geben Sie für Topicziele eine Rücksetzwarteschlange (BOQUEUE) und einen Grenzwert für Zurücksetzen (BOTHRESH) für die IBM MQ-Systemwarteschlangen SYSTEM.DURABLE.MODEL.QUEUE und SYSTEM.NDURABLE.MODEL.QUEUE an. In diesem Fall wird die falsch formatierte Nachricht von IBM MQ behandelt. Weitere Informationen zur Behandlung von nicht verarbeitbaren Nachrichten finden Sie im Abschnitt IBM MQ Using Java™ in der IBM MQ-Bibliothek.