RabbitMQ BasicAck 在控制台上给出通道关闭错误消息 - Spring AMQP

RabbitMQ BasicAck giving channel shutdown error messages on console - Spring AMQP

@EnableRabbit
@Service
public class RabbitMqListenerWithReply {


@Autowired
RabbitTemplate rabbitTemplate;

@Value("${test.rabbitmq.exchange}")
private String rabbitMQExchange;


@Value("${test.rabbitmq.routingkey}")
private String rabbitMQRoutingKey;

@RabbitListener(queues = "${test.rabbitmq.queue}")
public void receiveMessage(String message, Channel channel, 
@Header(AmqpHeaders.DELIVERY_TAG)long tag) throws IOException {
    System.out.println(message.toString());
    channel.basicAck(tag, false);
    System.out.println("Ackd"); 
    
}
}

我正在尝试实现一个侦听器,它在我使用消息后确认该消息,但是控制台会 return 这个错误,所以有人可以指导我哪里可能出错了。

这是我现在 运行 发布者将消息发布到交易所时遇到的错误。

2022-01-03 09:35:33.192 ERROR 27280 --- [ 127.0.0.1:5672] o.s.a.r.c.CachingConnectionFactory       : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)

2022-01-03 09:35:34.208  INFO 27280 --- [ntContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer : Restarting Consumer@52d7ab79: tags=[[amq.ctag-0pIM_-TROTIxXRsAJpmOrw]], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,1), conn: Proxy@71369e1a Shared Rabbit Connection: SimpleConnection@60b616c8 [delegate=amqp://guest@127.0.0.1:5672/, localPort= 57660], acknowledgeMode=AUTO local queue size=0

这就是我现在发布消息的方式。

@RestController
@RequestMapping("api/test")
public class RestAPIController {
@Autowired
RabbitTemplate rabbitTemplate;

@Value("${test.rabbitmq.exchange}")
private String rabbitMQExchange;

@Value("${test.rabbitmq.routingkey}")
private String rabbitMQRoutingKey;

@Value("${test.rabbitmq.queue}")
private String rabbitMQQueue;



@GetMapping("{message}")
public String testAPI(@PathVariable("message") String message) {
    System.out.println("Message sent: " + message);
    rabbitTemplate.convertAndSend(rabbitMQExchange, rabbitMQRoutingKey , message);
    return "The message was sent";
}

}

@RabbitListener默认使用AUTO-ACK

The container acknowledges the message automatically, unless the MessageListener throws an exception.

所以如果在listener中ack一次,框架会ack一次,重复ack会导致这个异常。

尝试:

@RabbitListener(queues = "xxx", ackMode = "MANUAL")