首页 > 解决方案 > Rabbitmq + Spring AMQP:重新发送消息但没有确认返回

问题描述

我使用spring amqp发送msg,如果ack=false,添加重发逻辑,使用相同的rabbitTemplate

 @Bean
public RabbitTemplate customRabbitTemplate(ConnectionFactory connectionFactory) {
   RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
   rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter());
   rabbitTemplate.setMandatory(true);
   rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {

       RabbitMetaMessage metaMessage = (RabbitMetaMessage) mqMsgUtil.getMetaMsg(cacheKey);
       //1 receive ack
       if (ack) {
       // send success   
           mqMsgUtil.setMsgSuccess(cacheKey);
           SUCESS_SEND = true;
       // send failed
       } else {

           reSendMsg(cacheKey, metaMessage, rabbitTemplate);
       }
   });

  public void reSendMsg(String msgId, RabbitMetaMessage rabbitMetaMessage,RabbitTemplate rabbitTemplate) {
     rabbitTemplate.convertAndSend(rabbitMetaMessage)
     .....
  }

我第一次发送 msg 时可以“1 接收 ack”,但是在 seSendMsg 中并使用 RabbitTemplate 再次发送 msg 时,我无法再次接收 ack。这是怎么回事?

标签: rabbitmqamqpspring-amqpspring-rabbit

解决方案


不允许在 ack 回调上发送消息;它会导致客户端库中的死锁。您需要在不同的线程上重新发送。

在下一个版本 (2.1) 中,我们更改了代码以在不同的线程上调用回调,以避免用户代码必须这样做。请参阅AMQP-817及其链接答案


推荐阅读