1. 程式人生 > 實用技巧 >【rabbitmq】之手動ack

【rabbitmq】之手動ack

rabbitmq預設是自動ack,消費端只要消費,mq服務就會刪除這條訊息。

我們想象以下場景:

假如我們消費服務出現異常,這條訊息被mq服務刪除,當我們修復了消費服務,但是無法主動重新消費這條訊息,這種業務邏輯顯然是不可行的。

正常業務邏輯應該是本地業務執行成功,手動ack這條訊息。那有的小夥伴就說了,業務執行完畢,手動ack的時候恰好服務宕機了,重啟這不是會造成重複消費嗎?沒錯,這就牽扯mq的另一個問題了,mq訊息重複消費,後續文章會寫如何解決這個問題。本文主要講解mq的手動ack

mq的手動ack

application.properties配置

server.port=8080

spring.rabbitmq.host=dev-mq.ttsingops.com
spring.rabbitmq.port=5672
spring.rabbitmq.username=cddayuwen
spring.rabbitmq.password=cddayuwen@123
spring.rabbitmq.virtual-host=/cd
#釋出者確認
spring.rabbitmq.publisher-confirm-type=correlated
#釋出者到達確認
spring.rabbitmq.publisher-returns=true

spring.rabbitmq.listener.type=simple

#simple關閉自動ack,手動ack
spring.rabbitmq.listener.simple.acknowledge-mode=manual
### 開啟重試機制
spring.rabbitmq.listener.simple.retry.enabled=true
#最大重試傳遞次數
spring.rabbitmq.listener.simple.retry.max-attempts=3
#第一次和第二次嘗試傳遞訊息的間隔時間 單位毫秒
spring.rabbitmq.listener.simple.retry.initial-interval=5000ms
#最大重試時間間隔,單位毫秒
spring.rabbitmq.listener.simple.retry.max-interval=300000ms
#應用前一次重試間隔的乘法器,multiplier預設為1
spring.rabbitmq.listener.simple.retry.multiplier=3
#以上配置的間隔0s  5s  15s  45s


#重試次數超過上面的設定之後是否丟棄(消費者listener丟擲異常,是否重回佇列,預設true:重回佇列, false為不重回佇列(結合死信交換機))
spring.rabbitmq.listener.simple.default-requeue-rejected=true

### 模板配置
##設定為 true 後 消費者在訊息沒有被路由到合適佇列情況下會被return監聽,而不會自動刪除
spring.rabbitmq.template.mandatory=true

java程式碼,https://www.cnblogs.com/gyjx2016/p/13622097.html

mq訊息被消費

但是mq伺服器的訊息並沒有被刪除

程式碼改造如下