RabbitMQ设置TTL生存时间

本文介绍了如何在RabbitMQ中设置消息的TTL(Time To Live)。可以通过设置队列属性使所有消息共享相同的TTL,或者在发布消息时单独设置,确保消息在过期后从队列中删除。第一种方法适用于队列头部的消息过期检查,第二种方法则在消息消费前判断过期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public static void main(String[] args) throws IOException, TimeoutException {
    ConnectionFactory factory = new ConnectionFactory();
    {
        factory.setHost("49.232.202.201");
        factory.setUsername("gosuncn");
        factory.setPassword("123456");
        factory.setVirtualHost("/gosuncn");
    }
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();
    Map<String, Object> arguments = new HashMap<>();
    arguments.put("x-message-ttl", 10000);//设置过期时间10秒
    channel.queueDeclare(QUEUE_NAME, false, false, false, arguments);
    channel.basicPublish("", ROUTE_KEY, true, null, MESSAGE.getBytes());
    System.out.println("message delivery [" + MESSAGE + "]");
}

通过设置队列属性的方式来设置TTL,也就是说队列中所有的消息都是有相同的TTL属性。

也可以通过设置单条消息的方式设置:

public static void main(String[] args) throws IOException, TimeoutException {
    ConnectionFactory factory = new ConnectionFactory();
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();
    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
    builder.deliveryMode(2);
    builder.expiration("6000");
    AMQP.BasicProperties properties = builder.build();
    channel.basicPublish("", ROUTE_KEY, true, properties, MESSAGE.getBytes());
    System.out.println("message delivery [" + MESSAGE + "]");
}

设置队列属性:一旦消息过期,就会从队列中抹去。

设置消息属性:即使消息过期,也不会马上从队列中抹去,因为每条消息是否过期时在即将投递到消费者之前判定的。

解析:因为第一种方法里,队列中已过期的消息肯定在队列头部,RabbitMQ只要定期从队头开始扫描是否有过期消息即可,而第二种方法里,每条消息的过期时间不同,如果要删除所有过期消息,势必要扫描整个队列,所以不如等到此消息即将被消费时再判定是否过期,如果过期,再进行删除。

  • Queue TTL

queue.declare 命令中的 x-expires 参数控制 queue 被自动删除前可以处于未使用状态的时间

用于表示超期时间的 x-expires 参数值以微秒为单位,并且服从和 x-message-ttl 一样的约束条件,且不能设置为 0

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-expires", 1800000);
channel.queueDeclare("order", false, false, false, args);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值