天天看點

rabbitmq消費端auto和manual差別;處理mq的requeue

概述

auto

manual

差別其實就如字面意思一般,

auto

代表自動确認消息,隻要消費者的方法執行完了,就自動告訴

mq

目前消息确認.

manual

則是需要手動通知

mq

。不需要想的很複雜就是這麼直接.

auto自動确認

  1. 消息成功被消費,沒有抛出異常,則自動确認,回複ack。
  2. 當抛出

    ImmediateAcknowledgeAmqpException

    異常,則視為成功消費,确認該消息。
  3. 當抛出

    AmqpRejectAndDontRequeueException

    異常的時候,則消息會被拒絕丢棄,并且不會重新入隊。
  4. 其他的異常,則消息會被拒絕,且

    requeue = true

    (預設就是true)時會重新入隊

manual人工确認

無論有沒有異常,标準隻有是否主動調用

basicAck()、basicNack()

等方法,沒有調用則一直阻塞.

是以有異常時,(有重試就重試),抛出異常後,沒有調用時,還是會一直阻塞。即使是

auto

模式的那兩個特殊的異常,在

manual

中都是一樣的,不會有特殊處理.

關于default-requeue-rejected(重新入隊)屬性的優先級

server:
  port: 9009
spring:
  rabbitmq:
    host: xxxx
    port: 5672
    username: xxxx
    password: xxxx
    virtual-host: /fchan
    listener:
      simple:
        #(預設值為true)在消費者出現異常時是否丢棄該消息還是重新入隊,true:重新入隊,入隊後在隊首
        #default-requeue-rejected: true
        #qos = concurrency * prefetch
        #concurrency: 1 
        #max-concurrency: 5
        #qos = concurrency * prefetch
        prefetch: 2
        #acknowledge-mode: auto
           
  1. 最高優先級:

    AmqpRejectAndDontRequeueException

    處理的

    requeue = false

    (剩下那個特殊異常視為成功,與此處無關),抛出這個異常的時候直接就是拒絕并且丢棄。
  2. 其次是手動确認時

    basicNack()

    boolean requeue

    參數
  3. 接着便是這個參數定義的重新入隊

    default-requeue-rejected

  4. auto

    模式中,處理其他異常時,拒絕消息,此時如果配置了

    default-requeue-rejected=false

    則會丢棄消息

繼續閱讀