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")
@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")