Rabbitmq + Spring AMQP:重新发送msg,但没有确认返回

时间:2018-07-10 07:22:08

标签: rabbitmq amqp spring-amqp spring-rabbitmq

我使用spring amqp发送消息,并在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接收确认”,但是在seSendMsg中使用RabbitTemplate再次发送msg时,我无法再次接收ack。这种情况如何?

1 个答案:

答案 0 :(得分:1)

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

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