RabbitMq入门(七)消息处理(消息持久化autoDelete、消息确认ACK机制)

目录

消息持久化处理

    autoDelete属性

消息确认ACK机制

    解决方式


消息持久化处理

消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化。

    autoDelete属性

@Queue: 当所有消费客户端连接断开后,是否自动删除队列 true:删除false:不删除

@Exchange:当所有绑定队列都不在使用时,是否自动删除交换器 true:删除false:不删除

当Queue中的 autoDelete 属性被设置为true时,那么,当消息接收着宕机,关闭后,消息队列则会删除,消息发送者一直发送消息,当消息接收者重新启动恢复正常后,会接收最新的消息,而宕机期间的消息则会丢失

当Quere中的 autoDelete 属性被设置为false时,那么,当消息接收者宕机,关闭后,消息队列不会删除,消息发送者一直发送消息,当消息接收者重新启动恢复正常后,会接收包括宕机期间的消息

autoDelete设置是否为临时的,临时的当消息接收者关闭时,队列、交换器则会被删除。为true时,则不会被删除。

消息确认ACK机制

消息确认机制,就是说,确认消息正常执行了。当消息正常执行后,会返回一个ACK。没有正常执行则不会返回ACK

RabbitMq入门(七)消息处理(消息持久化autoDelete、消息确认ACK机制)_第1张图片

消息发送者向消息队列中发送一条消息,然后在消息接收者那里 手动的抛出一个异常 ,启动服务,由于消息接受者那里一直没有ACK反馈,那么消息就会一直返回到消息队列中,直到消息被正常执行消费。

RabbitMq入门(七)消息处理(消息持久化autoDelete、消息确认ACK机制)_第2张图片

RabbitMq控制台就会显示一条消息未被消费。

RabbitMq入门(七)消息处理(消息持久化autoDelete、消息确认ACK机制)_第3张图片

当发送很多消息的时候,第一条无法正常执行消费,那么,后面的所有消息都无法执行,会一直存在消息队列中,这样就会导致内存问题。这是一个很严重的问题

RabbitMq入门(七)消息处理(消息持久化autoDelete、消息确认ACK机制)_第4张图片

    解决方式

RabbitMq入门(七)消息处理(消息持久化autoDelete、消息确认ACK机制)_第5张图片

第一种方式:

    可以对这个异常进行处理,最简单的就是try catch一下。

第二种方式

    可以在配置yml文件中配置一个尝试次数,尝试几次失败后就不再尝试了,将消息删除。

#开启重试 
spring: 
    rabbitmq: 
        listener: 
            retry: 
                enabled:true

#重试次数,默认为3次
spring:
    rabbitmq:
        listener:
            retry:
                max-attempts: 5

 

你可能感兴趣的:(RabbitMq)