Springboot配置Rabbitmq的returncallback不生效问题

当我用以下配置消息路由失败不会触发returncallback

@Configuration
public class RabbitMqConfig {

  @Bean
  RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
    rabbitTemplate.setReturnsCallback(returned -> {

      System.out.println("message = " + returned.getMessage());
      System.out.println("exchange = " + returned.getExchange());
      System.out.println("replyText = " + returned.getReplyText());
      System.out.println("routingKey = " + returned.getRoutingKey());
      System.out.println("replyCode = " + returned.getReplyCode());
    });

    return rabbitTemplate;
  }
}

当我换成以下配置时就会生效,请指点原因

@Configuration
public class RabbitMqConfig {
  @Autowired
  RabbitTemplate rabbitTemplate;
  @PostConstruct
  void rabbitTemplate(){
    rabbitTemplate.setReturnsCallback(returned -> {
      System.out.println("message = " + returned.getMessage());
      System.out.println("exchange = " + returned.getExchange());
      System.out.println("replyText = " + returned.getReplyText());
      System.out.println("routingKey = " + returned.getRoutingKey());
      System.out.println("replyCode = " + returned.getReplyCode());
    });
  }
}

1.没有开启mandatory参数
在发送消息时,需要设置mandatory参数为true才能触发returncallback回调函数。如果没有设置该参数,即使消息无法路由到任何队列,也不会触发回调函数。

2.消息路由到了队列中
如果消息成功路由到了队列中,而不是无法路由到任何队列,那么returncallback回调函数也不会被触发。

3.Rabbitmq版本问题
在某些版本的Rabbitmq中,returncallback回调函数可能存在一些bug,导致无法触发回调函数。可以尝试升级Rabbitmq版本或者使用其他的消息中间件。