1. 程式人生 > >ActiveMQ 確認機制ACK(收到消息後,應該有一個回應也就是確認答復)

ActiveMQ 確認機制ACK(收到消息後,應該有一個回應也就是確認答復)

ons type javax IT 消費 vid clas 成功 刪除

一、ACK機制簡介

ACK (Acknowledgement),即確認字符,在數據通信中,接收站發給發送站的一種傳輸類控制字符。表示發來的數據已確認接收無誤。

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 單條消息確認

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來決定此消息的後續操作.。

二、ACK機制實現

1、在配置文件中配置應答方式

1 <!-- 應答模式是 INDIVIDUAL_ACKNOWLEDGE -->  
2 <property name="sessionAcknowledgeMode" value="4"></property>

2、在接收的代碼中,手動確認

給消息發送者一個回應“我收到你的消息了,你可以出隊了”,activemq在沒有配置應答方式的時候,他是默認確認的。但是需求的各不同,就需要有不同的配置

1 // 只要被確認後  就會出隊,接受失敗沒有確認成功,會在原隊列裏面
2 textMsg.acknowledge();  

ActiveMQ 確認機制ACK(收到消息後,應該有一個回應也就是確認答復)