只要消息被確認以後,才認爲消息被成功消費了。消息的成功消費包括三個階段:客戶端接收消息、客戶端處理消息以及客戶端確認消息。在事務性會話中,當一個事務被提交的時候,確認自動發生。在非事務性會話中,消息什麼時候被確認取決於建立會話時的應答模式(acknowledgement mode)。該參數有如下三個可選值:java
當消費者成功的從receive方法返回的時候,或者從MessageListener.onMessage監聽方法成功返回的時候,會話自動確認消費者收到的消息。可是注意的是,這種方式消費者端不必定是向服務器端一條一條的確認消息。服務器
代碼:session
// 經過Connection對象建立Session會話(上下文環境對象), // 參數一,表示是否開啓事務 // 參數二,表示的是簽收模式,通常使用的有自動簽收和客戶端本身確認簽收 Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
2.Session.CLIENT_ACKNOWLEDGEide
客戶經過消息的acknowledge方法確認消息。須要注意的是,在這種模式中,確認是在會話層上進行:確認一個被消費的消息將自動確認全部已被會話消費的消息。例如,若是一個消息消費者消費了10個消息,而後確認第5個消息,那麼全部10個消息都被確認。spa
代碼:code
// 使用Session來建立消息對象的生產者或者消費者 MessageConsumer createConsumer = session.createConsumer(destination); while (true) { TextMessage textMessage = (TextMessage) createConsumer.receive(); if (textMessage == null) break; // 客戶端的簽收模式, textMessage.acknowledge(); System.out.println("收到的內容爲" + textMessage.getText()); }
3.Session.DUPS_OK_ACKNOWLEDGE對象
批量確認方式。消費者端會按照必定的策略向服務器端間隔發送一個ack標示,表示某一批消息已經處理完成。若是JMS Provider失敗,那麼可能會致使一些重複的消息。若是是重複的消息,那麼JMS Provider必須把消息頭的JMSRedelivered字段設置爲true。事務
代碼:get