RabbitMQ(七) : 持久化及消息确认ACK机制

一、持久化

    消息的可靠性是RabbitMQ 的一大特色。下面来看下RabbitMQ是如何做到持久化的。

    其实很简单,就以第一个Direct为例说明。

     1.先启动消息接收者项目。

     2.将发送者的测试类修改如下,在发送的消息里加上序号。

     3.运行测试类后,查看接收者项目的控制台,例如下图,发送到第12条信息时,停掉接收者项目

  4.过一段时间后,再启动接收者项目,查看控制台,看下图可以发现数据是从36号开始。也就是说在服务器暂停的这段时间里,   从13到35号的消息都丢失了。

   

   5.设置持久化,就是将注解里的autoDelete 设为false

  

重复上面的3、4操作,分别查看控制台,如我这里的结果如下,(注意要先停掉发送者项目,因为代码是无限循环的)

系统在10:29:46的时候停了,然后在10:30:18秒重新启动了,在系统停止期间发送的消息立即就被接收到了。

autoDelete 属性

@Queue: 当所有消费客户端连接断开后,是否自动删除
队列true:删除false:不删除
@Exchange:当所有绑定队列都不在使用时,是否自动
删除交换器true:删除false:不删除

查看RabbitMQ管理后台,2个队列设置的autoDelete不同的结果就在于Features项,true会显示AD。

二、ACK机制

通俗的说,RabbitMQ为了保证消息的发送者在发出消息后要知道接收者是否正确的接收到消息,为了保证消息不丢失,则接收者必须反馈,如果发送者没有接收到反馈,那么默认情况下将一直发送消息。这时如果在接收者这块出现异常,那么就会导致死循环,消息则会不停地发送,内存会暂用越来越多。为了避免内存溢出情况发生,开启重试机制即可。

  1.模拟异常

   修改InfoReceiver.java

2.修改测评类

将死循环去掉

3.启动系统后,查看控制台,会发现不停的抛出异常信息

4.开启重试机制

  在接收者项目的配置文件里添加2个参数

#开启重试
spring.rabbitmq.listener.simple.retry.enabled=true
#重试次数,默认为3 次
spring.rabbitmq.listener.simple.retry.max-attempts=3

5.重新测试,会发现发送3次后抛出异常,之后就停止发送消息了

猜你喜欢

转载自blog.csdn.net/zhuiyue82/article/details/84100301