【rabbitmq】之手動ack
阿新 • • 發佈:2020-09-21
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伺服器的訊息並沒有被刪除
程式碼改造如下