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服務器的消息並沒有被刪除
代碼改造如下
參考文獻: