RabbitMQ-过期时间TTL

过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费这接收获取;过来之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。

  • 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间;
  • 第二种方法是对消息进行单独设置,每条消息TTL可以不同。

如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message被投递到死信队列,消费者将无法再收到该消息。

设置队列TTL

  1. 编写rabbitmq配置文件spring-rabbitmq.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
<!--定义过期队列及属性,不存在则自动创建-->
<rabbit:queue id="my_ttl_queue" name="my_ttl_queue" auto-declare="true">
<rabbit:queue-arguments>
<!--投递到该队列的消息如果没有消费都将在6秒之后被删除-->
<entry key="x-message-ttl" value-type="long" value="6000"/>
</rabbit:queue-arguments>

</rabbit:queue>
</beans>
  1. 在启动类导入配置文件
1
2
3
4
@SpringBootApplication
//导入配置文件
@ImportResource("classpath:/spring/spring-rabbitmq.xml")
public class SpringbootRabbitmqProducerApplication {
  1. 编写测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@SpringBootTest
class SpringbootRabbitmqProducerApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;

/**
* 过期队列消息
* 投递到该队列的消息如果没有消费都将在6秒之后被删除
*/
@Test
void ttlQueueTest() {
//路由键与队列同名
rabbitTemplate.convertAndSend("my_ttl_queue","发送消息到过期队列my_ttl_queue,6秒内不消费则不能再被消费");
}

}
  1. 结果

队列过期

设置消息TTL

消息的过期时间;只需要在发送消息(可以发送到任何队列,不管该队列是否属于某个交换机)的时候设置过期时间即可。在测试类中编写如下方法发送消息并设置过期时间到队列:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 过期时间
* 该消息投递任何交换机或队列的时候,如果到了过期时间则将从该队列中删除
*/
@Test
void ttlMessageTset() {
MessageProperties messageProperties = new MessageProperties();
//设置消息的过期时间,5秒
messageProperties.setExpiration("5000");
Message message = new Message("测试过期消息,5秒钟过期".getBytes(),messageProperties);
//路由键与队列同名
rabbitTemplate.convertAndSend("my_ttl_queue",message);
}

expiration字段以微妙为单位表示TTL值。且与x-message-ttl具有相同的约束条件。因为expiration字段必须为字符串类型,broker将只会接受以字符串形式表达的数字。

当同时指定了queue和message的TTL值,则两者中较小的那个才会起作用

最后更新: 2020年08月22日 14:32

原始链接: http://ligangit.com/2020/08/22/RabbitMQ-过期时间TTL/

× 请我吃糖~
打赏二维码