介绍
:::tips RabbitMQ是阅后即焚机制,RabbitMQ确认消息被消费者消费后会立刻删除
而RabbitMQ是通过消费者回执来确认消费者是否成功处理消息的:消费者获取消息后,应该向RabbitMQ发送ack回执,表明自己已经处理消息
SpringAMQP允许配置三种确认模式:
- manual:手动ack,需要在业务代码结束后,调用api发送ack
- auto:自动ack,由Spring监测listener代码是否出现异常,没有异常则返回ack,抛出异常则返回nack【默认】
- none:关闭ack,消息投递后会被立即删除
由此可知:
- none模式下,消息投递是不可靠的,可能丢失
- auto模式类似事务机制,出现异常时返回nack,消息回滚到mq;没有异常,返回ack
- manual:自己根据业务情况,判断什么时候返回ack或nack
none模式
添加配置
:::tips 在消息消费者的配置文件中添加配置 :::
spring:
rabbitmq:
listener:
simple:
#关闭ack
acknowledge-mode: none
auto模式
manual模式
添加配置
:::tips 在消息消费者的配置文件中添加配置 :::
spring:
rabbitmq:
listener:
simple:
#开启手动ack
acknowledge-mode: manual
编写代码
:::tips 在消息消费者接收消息时手动返回ack或nack :::
//将这个类注册到Spring容器中
@Component
@Slf4j
public class RabbitMqListener{
//声明指定队列,同时监听队列中的消息
@RabbitListener(queues = "simple.queue")
public void listen(String msg, Channel channel, Message message) throws IOException {
try {
System.out.println("接收到消息:" + msg);
//消息处理成功,返回ack
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
} catch (Exception e) {
log.error("消费消息失败了!",e);
//消息处理失败,返回nack
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
}
}
}