使用mq过程中出现了如下异常
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)
该错误是进行手动拒绝时出现该异常。
解决方法
1、保证当前响应模式是手动响应
spring:
rabbitmq:
host: 192.168.178.100
port: 5672
virtual-host: xxxx
username: xxxx
password: xxxx
connection-timeout: 5000ms
listener:
simple:
acknowledge-mode: manual
prefetch: 1 #每次从队列中取一个,轮询分发,默认是公平分发
retry:
max-attempts: 5 # 重试次数
enabled: true # 开启重试
或者使用注解
@RabbitListener(queues={"queueName"},ackMode = "MANUAL")
2、保证只有一次拒绝或响应
即手动拒绝之后不能再手动响应该条消息
@RabbitListener(queues={"queueName"},ackMode = "MANUAL")
@RabbitHandler
public void onMessage(Message message, Channel channel) throws IOException {
try {
//业务
if(){
channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
return;//注意:防止执行下方重复应答
}
//业务
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
} catch (Exception e) {
log.info("MQ消费异常:{}",e);
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}
}