# 回退消息
# 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()
);
}
}