我正在設計從隊列接收消息並更新數據庫中的列的JMS應用程序。我正在使用tomcat和消息偵聽器來偵聽消息(沒有MDB,也沒有Spring MDP's)。我希望在異常處理和事務處理中儘可能提供強大的設計,以便消息不會丟失。帶有異常處理的JMS事務
我應該使用jms會話事務模式和jdbc事務。 或者只是jdbc事務已經足夠(沒有jms會話提交或回滾),因爲這是數據庫表更新。
感謝
我正在設計從隊列接收消息並更新數據庫中的列的JMS應用程序。我正在使用tomcat和消息偵聽器來偵聽消息(沒有MDB,也沒有Spring MDP's)。我希望在異常處理和事務處理中儘可能提供強大的設計,以便消息不會丟失。帶有異常處理的JMS事務
我應該使用jms會話事務模式和jdbc事務。 或者只是jdbc事務已經足夠(沒有jms會話提交或回滾),因爲這是數據庫表更新。
感謝
一個JDBC事務是不夠的:如果你讀過的消息,並且對數據庫的操作失敗,並且tomcat
被關閉,該消息被丟失。
如果每個消息觸發在數據庫中插入/更新,你可以使用CLIENT_ACKNOWLEDGE
模式:
final boolean transacted = false;
final int ackMode = Session.CLIENT_ACKNOWLEDGE;
final QueueSession queueSession = queueConnection.createQueueSession(
transacted, ackMode);
所以,你可以閱讀該郵件,並更新數據庫。如果數據庫升級成功,您可以使用確認
message.acknowledge();
沒有acknowledge
消息,該消息將被重新傳遞:所以重新啓動後tomcat
,你的消息監聽器應該再次看到該消息。您可以使用queueSession.recover()
以編程方式重新開始交付。
因爲它有可能tomcat
關機成功DB更新和確認之間的權利,你應該確保正確處理重複的消息。
的變化是使用事務處理會話:
final boolean transacted = true;
// 2nd parameter is ignored if the session is transacted
final QueueSession queueSession = queueConnection.createQueueSession(
transacted, -1);
在這種模式下,你可以使用一個確認多個郵件提交:
queueSession.commit();
你需要這個模式,如果多個消息導致單個數據庫操作(在更新數據庫之前,您必須收集一些消息)。