美文网首页
7.过期时间(TTL)

7.过期时间(TTL)

作者: 12点前睡觉hhh | 来源:发表于2019-05-28 16:54 被阅读0次

    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分钟的队列。

    相关文章

      网友评论

          本文标题:7.过期时间(TTL)

          本文链接:https://www.haomeiwen.com/subject/detdtctx.html