@RabbitListener中的代码手动确认之后发生异常出现消费两次问题
解决方法:
先确认后发生异常,以下情况就会发生重复消费问题
@RabbitListener(queues = "${SmsQueue}") //监听发送短信队列
public void SmsReceiver(Message message, Channel channel) throws UnsupportedEncodingException {
try {//手动确认
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (IOException e) {
logger.error("消费者手动确认失败");
}
throw new NullPointerException();
}
如果发生异常而不执行手动确认,就会根据你application.xml的失败重试次数来重复,默认3次
throw new NullPointerException();
try {
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (IOException e) {
e.printStackTrace();
}
消费者手动确认,如果设置为手动确认而不执行basicAck的话就会导致循环重复消费这些消息。
正确写法是在最后一步才确认:
try {
throw new NullPointerException();
} catch (Exception e) {
logger.error("消费者手动确认失败");
}finally {
try {
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (IOException e) {
e.printStackTrace();
}
}