目录
消息持久化处理
消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化。
autoDelete属性
@Queue: 当所有消费客户端连接断开后,是否自动删除队列 true:删除false:不删除
@Exchange:当所有绑定队列都不在使用时,是否自动删除交换器 true:删除false:不删除
当Queue中的 autoDelete 属性被设置为true时,那么,当消息接收着宕机,关闭后,消息队列则会删除,消息发送者一直发送消息,当消息接收者重新启动恢复正常后,会接收最新的消息,而宕机期间的消息则会丢失
当Quere中的 autoDelete 属性被设置为false时,那么,当消息接收者宕机,关闭后,消息队列不会删除,消息发送者一直发送消息,当消息接收者重新启动恢复正常后,会接收包括宕机期间的消息。
autoDelete设置是否为临时的,临时的当消息接收者关闭时,队列、交换器则会被删除。为true时,则不会被删除。
消息确认ACK机制
消息确认机制,就是说,确认消息正常执行了。当消息正常执行后,会返回一个ACK。没有正常执行则不会返回ACK
消息发送者向消息队列中发送一条消息,然后在消息接收者那里 手动的抛出一个异常 ,启动服务,由于消息接受者那里一直没有ACK反馈,那么消息就会一直返回到消息队列中,直到消息被正常执行消费。
RabbitMq控制台就会显示一条消息未被消费。
当发送很多消息的时候,第一条无法正常执行消费,那么,后面的所有消息都无法执行,会一直存在消息队列中,这样就会导致内存问题。这是一个很严重的问题
解决方式
第一种方式:
可以对这个异常进行处理,最简单的就是try catch一下。
第二种方式
可以在配置yml文件中配置一个尝试次数,尝试几次失败后就不再尝试了,将消息删除。
-
#开启重试
-
spring:
-
rabbitmq:
-
listener:
-
retry:
-
enabled:
true
-
-
#重试次数,默认为3次
-
spring:
-
rabbitmq:
-
listener:
-
retry:
-
max-attempts:
5