rabbitMQ 延遲佇列外掛強制呼叫ReturnCallback裡returnedMessage方法

IT佳佳發表於2020-09-24

報錯資訊

訊息被伺服器退回。msg:�� sr java.lang.Integer⠤���8 I valuexr java.lang.Number������  xp   
, replyCode:312. replyText:NO_ROUTE, exchange:my-mq-exchange_D, routingKey :spring-boot-routingKey_D
[RabbitMQ 訊息傳送結果:]  成功!訊息唯一標識:b58e22fb-aa2b-4eb4-b8d4-6465fc26dd40

問題描述:

使用了x-delayed-message 延遲外掛,結果每次都強制觸發returnedMessage回撥方法????

解決方案

如果配置了傳送回撥ReturnCallback,外掛延遲佇列則會回撥該方法,因為傳送方確實沒有投遞到佇列上,只是在交換器上暫存,等過期時間到了 才會發往佇列。

並非是BUG,而是有原因的,建議利用if 去攔截這個異常,判斷延遲佇列交換機名稱,然後break;

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        //請注意!如果你使用了延遲佇列外掛,那麼一定會呼叫該callback方法,因為資料並沒有提交上去,而是提交在交換器中,過期時間到了才提交上去,並非是bug!你可以用if進行判斷交換機名稱來捕捉該報錯
        if(exchange.equals(RabbitConfig.EXCHANGE_D)){
            return;
        }
        logger.info("訊息被伺服器退回。msg:{}, replyCode:{}. replyText:{}, exchange:{}, routingKey :{}",
                new String(message.getBody()), replyCode, replyText, exchange, routingKey);
    }

參考來源:https://my.oschina.net/xiaominmin/blog/4503811

相關文章