Kurz gesagt: Nein, ohne JTATransactionManager und XA-fähige Datenquellen gibt es keine Unterstützung für 2-Phasen-Commit.
Sie sind Zeuge einer Koordinierung von zwei Lokale Transaktionen nur 1-Phasen-Übertragung unterstützt. Die grobe Durchführung dieser Abfolge von Ereignissen...
- JMS-Transaktion starten
- JMS-Nachricht lesen
- JDBC-Transaktion starten
- Schreiben in die Datenbank
- JDBC-Transaktion festschreiben
- JMS festschreiben/bestätigen
Die JMS-Transaktion wird zuerst gestartet und umschließt die verschachtelte JDBC-Transaktion, so dass die JMS-Warteschlange ein Rollback durchführt, wenn die Hibernate/JDBC-Übertragung fehlschlägt. Ihr JMS-Listener-Container sollte wie folgt eingerichtet sein nicht zu acknowledge="auto"
und warten stattdessen, bis die Hibernate-Transaktion abgeschlossen ist, bevor sie die Bestätigung senden.
Wenn Sie nur diese beiden Ressourcen haben, dann ist das Problem, das Sie berücksichtigen müssen, wenn Hibernate erfolgreich persistiert, dann erhalten Sie eine Exception, bevor Sie den JMS-Server bestätigen können. Das ist kein großes Problem, da die JMS-Nachricht nicht verloren geht und Sie sie wieder lesen können.
Allerdings
-
Sie müssen Ihren MessageListener so schreiben, dass er doppelte Nachrichten vom Server verarbeitet
-
Sie müssen auch mit einer Nachricht umgehen, die aufgrund von fehlerhaften Daten nicht verarbeitet werden kann und in einer Endlosschleife endet, in der versucht wird, sie zu verarbeiten. In diesem Fall kann der Server so konfiguriert sein, dass er die Nachricht in eine "tote Nachrichtenwarteschlange" verschiebt, oder Sie kümmern sich selbst darum in dem MessageListener
Andere Optionen und weiterführende Literatur
Wenn Ihr JMS-Server keine (globalen) XA-Transaktionen unterstützt, ist dies so ziemlich Ihre einzige Lösung.
Wenn der JMS-Server XA-Transaktionen unterstützt, JDBC aber nicht, können Sie einen JTATransactionManager verwenden und die LastResourceCommitOptimisation . Es gibt quelloffene JTATransactionManager, die Sie verwenden können, wie JOTM
Dieser JavaWorld-Artikel geht näher auf Ihren Problembereich ein.