1.JMS消息確認機制
JMS消息只有在被確認之後,才認為已經被成功地消費了。消息的成功消費通常包含三個階段:客戶接收消息、客戶處理消息和消息被確認。在事務性會話中,當一個事務被提交的時候,確認自動發生。在非事務性會話中,消息何時被確認取決於創建會話時的應答模式(acknowledgement mode)。該參數有以下三個可選值:
Session.AUTO_ACKNOWLEDGE。當客戶成功的從receive方法返回的時候,或者從MessageListener.onMessage方法成功返回的時候,會話自動確認客戶收到的消息。
Session.CLIENT_ACKNOWLEDGE。 客戶通過消息的acknowledge方法確認消息。需要注意的是,在這種模式中,確認是在會話層上進行:確認一個被消費的消息將自動確認所有已被會話消 費的消息。例如,如果一個消息消費者消費了10個消息,然後確認第5個消息,那麼所有10個消息都被確認。
Session.DUPS_ACKNOWLEDGE。 該選擇只是會話遲鈍第確認消息的提交。如果JMS provider失敗,那麼可能會導致一些重復的消息。如果是重復的消息,那麼JMS provider必須把消息頭的JMSRedelivered字段設置為true。
2.ActiveMQ消息確認機制
ActiveMQSession,實現了JMS的session,QueueSession, TopicSession
ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE 每條消息都必須顯式調用acknowledge方法確認消息。
3.消息持久性
JMS 支持以下兩種消息提交模式:
DeliveryMode.PERSISTENT 指示JMS provider持久保存消息,以保證消息不會因為JMS provider的失敗而丟失。 消息持久化在硬盤中,ActiveMQ持久化有三種方式:AMQ、KahaDB、JDBC。
DeliveryMode.NON_PERSISTENT 不要求JMS provider持久保存消息,消息存放在內存中,讀寫速度快,在JMS服務停止後消息會消失,沒有持久化到硬盤。