消息的簽收(Acknowledgment):
客戶端成功接收一條消息的標誌是這條消息被簽收。
成功接收一條消息一般包括如下三個階段:
(1) 客戶端接收消息
(2) 客戶端處理消息
(3) 消息被簽收
簽收可以由ActiveMQ發起,也可以由客戶端發起,取決於Session簽收模式的設置。
在帶事務的Session中,簽收自動發生在事務提交時。如果事務回滾,所有已經接收的消息將會被再次傳送。在不帶事務的Session中,一條消息何時和如何被簽收取決於Session的設置。
非事務會話可做如下設置:
1.Session.AUTO_ACKNOWLEDGE(自動確認模式)
當消息成功的從receive方法返回時,或者從MessageListener接口的onMessage方法成功返回時,會話自動確認客戶端的消息接收。
2.Session.CLIENT_ACKNOWLEDGE(客戶端確認模式)
客戶端通過調用消息的acknowledge方法簽收消息。在這種模式中,簽收是在會話層上進行:簽收一個已消費的消息會自動地簽收這個Session所有已消費消息的收條。
例如,如果一個消息消費者消費了10個消息,然後確認第5個消息,那麼所有10個消息都會被確認。
3. Session.DUPS_OK_ACKNOWLEDGE(延時/批量確認模式)
這種確認方式允許JMS不必急於確認收到的消息,允許在收到多個消息之後一次完成確認,與Auto_AcKnowledge相比,這種確認方式在某些情況下可能更有效,因爲沒有確認,當系統崩潰或者網絡出現故障的時候,消息可以被重新傳遞.
這種方式會引起消息的重複,但是降低了Session的開銷,所以只有客戶端能容忍重複的消息,纔可使用。(如果ActiveMQ再次傳送同一消息,那麼消息頭中的JMSRedelivered將被設置爲true)