2013-07-11 60 views
1

我正在設計從隊列接收消息並更新數據庫中的列的JMS應用程序。我正在使用tomcat和消息偵聽器來偵聽消息(沒有MDB,也沒有Spring MDP's)。我希望在異常處理和事務處理中儘可能提供強大的設計,以便消息不會丟失。帶有異常處理的JMS事務

我應該使用jms會話事務模式和jdbc事務。 或者只是jdbc事務已經足夠(沒有jms會話提交或回滾),因爲這是數據庫表更新。

感謝

回答

1

一個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(); 

你需要這個模式,如果多個消息導致單個數據庫操作(在更新數據庫之前,您必須收集一些消息)。