Java RabbitMQ中的消息长期不消费是否会过期

  

Java RabbitMQ中的消息长期不消费是否会过期,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1。默认情况

首先我们来看看默认情况。

默认情况下,消息是不会过期的,也就是我们平日里在消息发送时,如果不设置任何消息过期的相关参数,那么消息是不会过期的,即使消息没被消费掉,也会一直存储在队列中。

这种情况具体代码就不用我再演示了吧,松哥之前的文章凡是涉及到RabbitMQ的,基本上都是这样的。

2。TTL

TTL (time - to - live),消息存活的时间,即消息的有效期。如果我们希望消息能够有一个存活时间,那么我们可以通过设置TTL来实现这一需求。如果消息的存活时间超过了TTL并且还没有被消息,此时消息就会变成<代码>死信> 死信> 死信队列>

TTL的设置有两种不同的方式:

<李>

在声明队列的时候,我们可以在队列属性中设置消息的有效期,这样所有进入该队列的消息都会有一个相同的有效期。

<李>

在发送消息的时候设置消息的有效期,这样不同的消息就具有不同的有效期。

那如果两个都设置了呢?

以时间短的为准。

当我们设置了消息有效期后,消息过期了就会被从队列中删除了(进入到死信队列,后文一样,不再标注),但是两种方式对应的删除时机有一些差异:

对于第一种方式,当消息队列设置过期时间的时候,那么消息过期了就会被删除,因为消息进入RabbitMQ后是存在一个消息队列中,队列的头部是最早要过期的消息,所以RabbitMQ只需要一个定时任务,从头部开始扫描是否有过期消息,有的话就直接删除。对于第二种方式,当消息过期后并不会立马被删除,而是当消息要投递给消费者的时候才会去删除,因为第二种方式,每条消息的过期时间都不一样,想要知道哪条消息过期,必须要遍历队列中的所有消息才能实现,当消息比较多时这样就比较耗费性能,因此对于第二种方式,当消息要投递给消费者的时候才去删除。

介绍完TTL之后,接下来我们来看看具体用法。

接下来所有代码松哥都以弹簧引导中封装的AMPQ为例来讲解。

2.1单条消息过期

我们先来看单条消息的过期时间。

首先创建一个弹簧启动项目,引入Web和RabbitMQ依赖,如下:

癑ava

然后在应用程序。属性中配置一下RabbitMQ的连接信息,如下:

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=客人
spring.rabbitmq.password=
spring.rabbitmq客人。虚拟主机=/

接下来稍微配置一下消息队列:

@ configuration   public  class  QueueConfig  {      ,,,public  static  final  String  JAVABOY_QUEUE_DEMO =,“javaboy_queue_demo";   ,,,public  static  final  String  JAVABOY_EXCHANGE_DEMO =,“javaboy_exchange_demo";   ,,,public  static  final  String  HELLO_ROUTING_KEY =,“hello_routing_key";      ,,@ bean   ,,,Queue 队列(),{   ,,,,,,,return  new 队列(JAVABOY_QUEUE_DEMO,,真的,,假的,,假);   ,,,}      ,,@ bean   ,,,DirectExchange  directExchange (), {   ,,,,,,,return  new  DirectExchange (JAVABOY_EXCHANGE_DEMO,,真的,,假);   ,,,}      ,,@ bean   ,,,Binding 绑定(),{   ,,,,,,,return  BindingBuilder.bind(队列())   ,,,,,,,,,,,,,,,,(directExchange ())   ,,,,,,,,,,,,,,,的信誉(HELLO_ROUTING_KEY);   ,,,}   }

这个配置类主要干了三件事:配置消息队列,配置交换机以及将两者绑定在一起。

<李>

首先配置一个消息队列,新的一个队列:第一个参数是消息队列的名字;第二个参数表示消息是否持久化;第三个参数表示消息队列是否排他,一般我们都是设置为假,即不排他;第四个参数表示如果该队列没有任何订阅的消费者的话,该队列会被自动删除,一般适用于临时队列。

<李>

配置一个DirectExchange交换机。

<李>

将交换机和队列绑定到一起。

这段配置应该很简单,没啥好解释的,有一个排他性,松哥这里稍微多说两句:

Java RabbitMQ中的消息长期不消费是否会过期