RabbitMQ 过期时间 TTL

一、什么是TTL

        TTL,Time to Live的简称,中文为过期时间。顾名思义,就是设置对应的时间之后,实际运行过程中过了设置的时间就会过期(也就是死信)。

二、使用场景

使用时需要一定时间后做相关操作,以下有几个例子可参考:

1.订单支付超时后取消订单。

2.发布问题后,如果3天没有人回答,那么关闭文章回答功能。

3.外卖订单生成后,在规定时间内没有送达,将会做出相关惩罚处理。

三、具体使用方式

1.消息

        对消息自身进行单独设置,每条消息的TTL可以不同

(1)AMQP.BasicProperties.Builder

        try (Connection connection = connectionFactory.createConnection();
             Channel channel = connection.createChannel(false)) {

            AMQP.BasicProperties.Builder mqBuilder = new AMQP.BasicProperties.Builder();
            mqBuilder.deliveryMode(2);  // 设置消息是否持久化,1: 非持久化 2:持久化
            mqBuilder.expiration("8000");
            AMQP.BasicProperties properties = mqBuilder.build();
            channel.basicPublish("交换器名称", "路由名称", false, properties, "内容".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }

(2)  调用HTTP API接口进行设置

$ curl -i -u root:toot -H "content-type:application/json" -X POST -d '{"properties":{"expiration":8000},"routing_key":"your_route_key","payload":" this is payload","payload_encoding":"string"} http://localhost:15672/api/exchanges/{实际vhost}/{实际交换器名称}/publish

2.队列

        通过Queue属性设置,队列中所有消息都有相同的过期时间

(1)队列有个属性x-message-ttl,通过channel.queueDeclare进行设置

try (Connection connection = connectionFactory.createConnection();
             Channel channel = connection.createChannel(false)) {
            // 参数配置map
            Map<String, Object> configMap = new HashMap<>();
            configMap.put("x-message-ttl", 8000);
            channel.queueDeclare("queue.ttl.show", false, false, false, configMap);
        } catch (Exception e) {
            e.printStackTrace();
        }

(2)运用命令通过Policy进行设置

rabbitmqctl set_policy TTL ".*" '{"message-ttl":8000}' --applay-to queues

(3) 调用HTTP API接口进行设置

$ curl -i -u root:toot -H "content-type:application/json" -X PUT -d '{"auto_delete":false,"durable":true,"arguments":{"x-message-ttl":8000}} http://localhost:15672/api/queues/{实际vhost}/{实际queueName}

3.总结

        以上两种方式如果一起使用,那么最终会以设置的较小的TTL值作为实际使用的TTL。 

        通过消息方式进行设置TTL,那么,消息过期时,并不会马上消失,因为过期时间在每条消息上,如果删除,那么需要扫描整个队列,因此在消息即将发送的时候,在进行过期时间的判断,如果过期则删除。

        通过队列方式设置TTL,一旦消息过期,直接进行删除,因为已过期的消息在队列的头部,定期扫描头部,就能找到所有已过期的消息。

        删除时,不一定马上删除,需要一定的时间。当RabbitMq重启后,经过持久化的队列的过期时间会重新计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值