【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消息被消費

 

image

 

 

但是mq服務器的消息並沒有被刪除

 

image

 

 

代碼改造如下

image

 

 

參考文獻:

1、https://docs.spring.io/spring-boot/docs/2.2.11.BUILD-SNAPSHOT/reference/html/appendix-application-properties.html#common-application-properties

2、https://docs.spring.io/spring-boot/docs/2.2.11.BUILD-SNAPSHOT/reference/html/spring-boot-features.html#boot-features-amqp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM