RabbitMQ(五):TTL、DLX、延迟队列

TTL

TTL:time to live,即过期时间,在RabbitMQ中分为队列的TTL和消息的TTL。

设置消息的TTL

  • 设置消息的TTL有两种方式,一是针对单条消息、在basic.publish中设置,这样每条消息的TTL可以设置为不同的;二是通过队列属性设置消息的TTL,这样队列中所有的消息都具有相同的TTL。
  • 如果两种方式同时使用,则消息会按照两者最短的超时时间为准。消息一旦超过超时时间,则会变为死信(dead message),此时消费者无法再收到该消息。但是可以通过死信队列的形式消费该消息。
  • 通过队列属性设置消息的TTL
    此时NORMAL_QUEUE这个队列的所有消息都为3S过期,一旦过期、消息直接丢弃。如果配合死信队列、可以将过期消息发送至死信队列另作处理。
            channel.exchangeDeclare(NORMAL_EXCHANGE, "direct", true);
            Map<String, Object> params = new HashMap<>(4);
            params.put("x-message-ttl", 3000);
            params.put("x-dead-letter-exchange", DLX_EXCHANGE);
            params.put("x-dead-letter-routing-key", DLX_ROUTING_KEY);

            channel.queueDeclare(NORMAL_QUEUE, true, false, false, params);
            channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE, DLX_ROUTING_KEY);
            channel.basicPublish(NORMAL_EXCHANGE, DLX_ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, "hello dlx message".getBytes());
  • 通过basic.publish设置消息的TTL
    此时、当前消息的过期时间为6S,一旦过期、不会立即丢弃,可是不能消费,RabbitMQ会在消费的时候判定消息是否已过期。
            channel.exchangeDeclare("message_ttl_exchange", "direct", true);
            channel.queueDeclare("message_ttl_queue", true, false, false, null);
            channel.queueBind("message_ttl_queue", "message_ttl_exchange", "message_ttl");
            AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
            builder.deliveryMode(2);
            builder.expiration("6000");
            AMQP.BasicProperties properties = builder.build();
            channel.basicPublish("message_ttl_exchange", "message_ttl", properties, "message消息级别的过期设置".getBytes());

设置队列的TTL

DLX

延迟队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值