RabbitMQ-09-过期时间TTL

RabbitMQ-09-过期时间TTL

1. TTL的概念

  • 过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。

  • RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。

    • 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。
    • 第二种方法是对消息进行单独设置,每条消息TTL可以不同。
  • 如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。

  • 消息在队列的生存时间一旦超过设置的TTL值,就称为dead message被投递到死信队列, 消费者将无法再收到该消息。

TTL的标识

mark

1.1 方式一:通过队列设置TTL

  • 参数x-message-ttl

  • 通过在channel.queueDeclare设置参数

  • 核心代码

1
2
3
Map<String,Object> args2 = new HashMap<>();
args2.put("x-message-ttl",5000);
channel.queueDeclare("ttl.queue", true, false, false, args2);

1.2 方式二:通过设置单条消息的TTL

  • 通过设置每条消息的TTL 是在 channel.basicPublish 方法中加入expiration的属性参数

  • 核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 6: 准备发送消息的内容
String message = "你好,学相伴!!!";
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("x", "1");
headers.put("y", "1");
AMQP.BasicProperties basicProperties = new AMQP.BasicProperties().builder()
.deliveryMode(2) // 传送方式
.priority(1)
.contentEncoding("UTF-8") // 编码方式
.expiration("5000") // 过期时间
.headers(headers).build(); //自定义属性
// 7: 发送消息给中间件rabbitmq-server
// @params1: 交换机exchange
// @params2: 队列名称/routing
// @params3: 属性配置
// @params4: 发送消息的内容
for (int i = 0; i <10 ; i++) {
channel.basicPublish("", "ttl.queue2", basicProperties, message.getBytes());
System.out.println("消息发送成功!");
}

1.3 两种方式的区别

  • 第一种方法里,队列已过期的消息肯定在队列的头部,RabbitMQ 只要定期扫描从队列的头部扫描是否有过期消息即可
  • 第二种方式,每条消息的国企时间不同,如果要删除所有的过期消息势必要扫描整个队列,所以步入等到此消息即将被消息时再判定是否过期,如果过期再进行删除即可。

2. 队列的TTL

  • 通过在channel.queueDeclare方法中的x-expires 参数可以控制队列被自动删除前处于多久未使用的状态
    • 未使用的意思是队列上没有任何消费者,队列也没有被重新声明,并且这段时间内也灭有调用过Basic.Get() 命令
  • 核心代码
1
2
3
Map<String,Object> args2 = new HashMap<>();
args2.put("x-expires",5000);
channel.queueDeclare("ttl.queue", true, false, false, args2);
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信