一、簡介
消息消費者有沒有接收到消息,需要有一種機制讓消息提供者知道,這個機制就是消息確認機制。
ACK(Acknowledgement)即確認字符,在數據通信中,接收站發給發送站的一種傳輸類控制字符。表示發來的數據已確認接收無誤。
二、ACK_MODE有幾類
我們在開發JMS應用程序的時候,會經常使用到上述ACK_MODE,其中"INDIVIDUAL_ACKNOWLEDGE "只有ActiveMQ支持,當然開發者也可以使用它. ACK_MODE描述了Consumer與broker確認消息的方式(時機),比如當消息被Consumer接收之后,Consumer將在何時確認消息。對於broker而言,只有接收到ACK指令,才會認為消息被正確的接收或者處理成功了,通過ACK,可以在consumer與Broker之間建立一種簡單的“擔保”機制.
JMS API中約定了Client端可以使用四種ACK_MODE,在javax.jms.Session接口中:
AUTO_ACKNOWLEDGE = 1 自動確認 CLIENT_ACKNOWLEDGE = 2 客戶端手動確認 DUPS_OK_ACKNOWLEDGE = 3 自動批量確認 SESSION_TRANSACTED = 0 事務提交並確認
此外AcitveMQ補充了一個自定義的ACK_MODE:
INDIVIDUAL_ACKNOWLEDGE = 4 單條消息確認
三、ACK_TYPE有幾類
Client端指定了ACK_MODE,但是在Client與broker在交換ACK指令的時候,還需要告知ACK_TYPE,ACK_TYPE表示此確認指令的類型,不同的ACK_TYPE將傳遞着消息的狀態,broker可以根據不同的ACK_TYPE對消息進行不同的操作。
比如Consumer消費消息時出現異常,就需要向broker發送ACK指令,ACK_TYPE為"REDELIVERED_ACK_TYPE",那么broker就會重新發送此消息。在JMS API中並沒有定義ACT_TYPE,因為它通常是一種內部機制,並不會面向開發者。ActiveMQ中定義了如下幾種ACK_TYPE(參看MessageAck類):
DELIVERED_ACK_TYPE = 0 消息"已接收",但尚未處理結束 STANDARD_ACK_TYPE = 2 "標准"類型,通常表示為消息"處理成功",broker端可以刪除消息了 POSION_ACK_TYPE = 1 消息"錯誤",通常表示"拋棄"此消息,比如消息重發多次后,都無法正確處理時,消息將會被刪除或者DLQ(死信隊列) REDELIVERED_ACK_TYPE = 3 消息需"重發",比如consumer處理消息時拋出了異常,broker稍后會重新發送此消息 INDIVIDUAL_ACK_TYPE = 4 表示只確認"單條消息",無論在任何ACK_MODE下 UNMATCHED_ACK_TYPE = 5 BROKER間轉發消息時,接收端"拒絕"消息
到目前為止,我們已經清楚了大概的原理: Client端在不同的ACK_MODE時,將意味着在不同的時機發送ACK指令,每個ACK Command中會包含ACK_TYPE,那么broker端就可以根據ACK_TYPE來決定此消息的后續操作.。
