介绍

:::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

一般使用默认的auto模式即可 :::

none模式

添加配置

:::tips 在消息消费者的配置文件中添加配置 :::

  1. spring:
  2. rabbitmq:
  3. listener:
  4. simple:
  5. #关闭ack
  6. acknowledge-mode: none

auto模式

:::tips 默认就是auto模式,无需配置 :::

manual模式

添加配置

:::tips 在消息消费者的配置文件中添加配置 :::

  1. spring:
  2. rabbitmq:
  3. listener:
  4. simple:
  5. #开启手动ack
  6. acknowledge-mode: manual

编写代码

:::tips 在消息消费者接收消息时手动返回ack或nack :::

  1. //将这个类注册到Spring容器中
  2. @Component
  3. @Slf4j
  4. public class RabbitMqListener{
  5. //声明指定队列,同时监听队列中的消息
  6. @RabbitListener(queues = "simple.queue")
  7. public void listen(String msg, Channel channel, Message message) throws IOException {
  8. try {
  9. System.out.println("接收到消息:" + msg);
  10. //消息处理成功,返回ack
  11. channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
  12. } catch (Exception e) {
  13. log.error("消费消息失败了!",e);
  14. //消息处理失败,返回nack
  15. channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
  16. }
  17. }
  18. }