7.过期时间(TTL)

2019-05-28  本文已影响0人  12点前睡觉hhh

TTL,Time to live即过期时间。RabbitMQ可以对消息和队列设置过期时间。

1.设置消息的TTL

目前有两种方式可以设置消息的TTL
1.通过队列属性设置,则队列中的所有消息都有相同的过期时间。
2.对消息本身进行单独设置,则每条消息的过期时间都不同。
如果两个方法一起使用,则取较小值。消息在队列中的生存时间一旦超过TTL,则消费者无法再收到此消息,即变为“死信”。

1.1.在队列属性中设置消息的TTL

在声明队列即方法channel.queueDeclare中加入x-message-ttl参数实现,计数单位是毫秒。
示例如下:

//过期时间6000毫秒
Map<String,Object> args=new HashMap<>();
args.put("x-message-ttl",6000);
channel.queueDeclare("queueDemo",true,false,false,args);

如果不设置TTL,则表示消息永不过期;如果将TTL设置为0,则表示除非此时可以直接将消息投递到消费者,否则该消息会被立即丢弃。

1.2.在消息属性中设置TTL

在basicPublish方法中加入expiration的属性参数,单位为毫秒。

        AMQP.BasicProperties.Builder builder=new AMQP.BasicProperties.Builder();
        builder.deliveryMode(2);
        builder.expiration("6000");
        AMQP.BasicProperties properties=builder.build();
        channel.basicPublish(EXCHANGE_NAME, "item.insert", properties, message.getBytes());

2.设置队列的TTL

通过channel.queueDelare方法中的x-expires参数可以控制队列被自动删除前处于未使用状态的时间。未使用的意思是队列上没有任何的消费者,队列也没有被重新声明,并且在过期时间段内也未调用过basicGet命令。
RabbitMQ会确保在过期时间到达后将队列删除,但是不保证删除的动作及不及时。在RabbitMQ重启后,持久化的队列的过期时间会重新计算。
实例:

      Map<String,Object> args=new HashMap<>();
      args.put("x-expires",60000);
      channel.queueDeclare("queueDemo",true,false,false,args);

上述代码声明了一个过期时间为1分钟的队列。

上一篇下一篇

猜你喜欢

热点阅读