# 回退消息

# Mandatory 参数

在仅开启了生产者确认机制的情况下,交换机接收到消息后,会直接给消息生产者发送确认消息,如 果发现该消息不可路由,那么消息会被直接丢弃,此时生产者是不知道消息被丢弃这个事件的。那么如何 让无法被路由的消息帮我想办法处理一下?最起码通知我一声,我好自己处理啊。通过设置 mandatory 参 数可以在当消息传递过程中不可达目的地时将消息返回给生产者。

代码和消息确认差不多

# 代码

# 配置

spring:
  rabbitmq:
    # 回退消息
    publisher-returns: true

# 生产者


import com.example.mq_s.config.RabbitConfirmConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;

@Slf4j
@RestController
@RequestMapping("ack")
public class ConfirmController implements RabbitTemplate.ReturnsCallback {

    @PostConstruct
    public void setConfirmBack() {
        //注入确认消息
        rabbitTemplate.setReturnsCallback(this);
    }

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/publish")
    public String publishMessageAck(String msg) {
        rabbitTemplate.convertAndSend(RabbitConfirmConfig.CONFIRM_ACK_EXCHANGE,
                RabbitConfirmConfig.CONFIRM_ACK_ROUTING_KEY,
                msg,
                new CorrelationData("123")
        );

        return "yes";
    }

    @Override
    public void returnedMessage(ReturnedMessage returned) {
        log.error("消息:{},被交换机:{}退回,退回原因:{},路由:{}",
                returned.getMessage(),
                returned.getExchange(),
                returned.getReplyText(),
                returned.getRoutingKey()
        );
    }
}