zoukankan      html  css  js  c++  java
  • Rabbitmq的过期时间

    过期时间TTL

    过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。

    • 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。
    • 第二种方法是对消息进行单独设置,每条消息TTL可以不同。

    如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message被投递到死信队列, 消费者将无法再收到该消息。

    image-20200902160748223

    1. 设置队列TTL

    在创建配置类添加如下内容:

    /**
     * @author WGR
     * @create 2020/9/2 -- 15:44
     */
    @Configuration
    public class RabbitTTLMqConfig {
    
        //队列名称
        public static final String TTL_QUEUE = "ttl_queue1";
    
        //声明队列
        @Bean("ttlQueue")
        public Queue ttlQueue(){
            Map<String,Object> arguments = new HashMap<>();
            arguments.put("x-message-ttl",60000);
            return QueueBuilder.durable(TTL_QUEUE).withArguments(arguments).build();
        }
    }
    
    

    然后在测试类 spring-rabbitmq-producersrc estjavacomdalianpai abbitmqProducerTest.java 中编写如下方法发送消息到上述定义的队列:

        /**
         * 过期队列消息
         * 投递到该队列的消息如果没有消费都将在6秒之后被删除
         */
        @Test
        public void ttlQueueTest(){
            //路由键与队列同名
            rabbitTemplate.convertAndSend("ttl_queue1", "发送到过期队列ttl_queue1,6秒内不消费则不能再被消费。");
        }
    

    参数 x-message-ttl 的值 必须是非负 32 位整数 (0 <= n <= 2^32-1) ,以毫秒为单位表示 TTL 的值。这样,值 6000 表示存在于 队列 中的当前 消息 将最多只存活 6 秒钟。

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

    2. 设置消息TTL

    消息的过期时间;只需要在发送消息(可以发送到任何队列,不管该队列是否属于某个交换机)的时候设置过期时间即可。在测试类中编写如下方法发送消息并设置过期时间到队列:

        /**
         * 过期消息
         * 该消息投递任何交换机或队列中的时候;如果到了过期时间则将从该队列中删除
         */
        @Test
        public void ttlMessageTest(){
            MessageProperties messageProperties = new MessageProperties();
            //设置消息的过期时间,3秒
            messageProperties.setExpiration("3000");
    
            Message message = new Message("测试过期消息,3秒钟过期".getBytes(), messageProperties);
            //路由键与队列同名
            rabbitTemplate.convertAndSend("ttl_queue1", message);
        }
    
    

    expiration 字段以豪秒为单位表示 TTL 值。且与 x-message-ttl 具有相同的约束条件。因为 expiration 字段必须为字符串类型,broker 将只会接受以字符串形式表达的数字。

    当同时指定了 queue 和 message 的 TTL 值,则两者中较小的那个才会起作用。

  • 相关阅读:
    数据结构:图 (总结)
    排序算法总结(此篇文章是14年写作,代码难看,请看我新发表的排序总结)
    no identifier specified for entity错误
    哈夫曼编码算法思想总结
    线索二叉树
    ORACLE 错误 ora-01830 解决方法
    (转)web会话管理方式
    (转)C3P0配置
    分页技术()
    简易 DBUtil 封装
  • 原文地址:https://www.cnblogs.com/dalianpai/p/13602321.html
Copyright © 2011-2022 走看看