• SpringCloudStream学习(四)TTL(存活时间)Dead Letter Exchanges(死信交换机)


    TTL(Time-To-Live and Expiration)

    RabbitMQ既能对队列设置TTL也能对消息设置TTL,消息TTL可以应用于单个队列、一组队列或应用于逐个消息。

    如何给消息设置TTL?

    rabbitmqctl rabbitmqctl set_policy TTL ".*" '{"message-ttl":60000}' --apply-to queues
    rabbitmqctl (Windows) rabbitmqctl set_policy TTL ".*" "{""message-ttl"":60000}" --apply-to queues

    或者

    byte[] messageBodyBytes = "Hello, world!".getBytes();
    AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
                                       .expiration("60000")
                                       .build();
    channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);
    

    如何给队列设置TTL?

    rabbitmqctl rabbitmqctl set_policy expiry ".*" '{"expires":1800000}' --apply-to queues
    rabbitmqctl (Windows) rabbitmqctl.bat set_policy expiry ".*" "{""expires"":1800000}" --apply-to queues

    或者:

    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-message-ttl", 60000);
    channel.queueDeclare("myqueue", false, false, false, args);
    

    死信队列:跟死信交换机绑定的队列

    死信交换机:

    当以下的任意情况发生的时候,意味着队列中的该消息变成了死信

    1. 消费者调用了basic.reject/basic.nack 并且设置requeuefalse(不重回队列)的时候,消息就会进入死信队列 。
    2. 消息有效期过期。
    3. 队列达到最大的长度,并且我们没有设置自动拒绝消息的时候,队首的消息就会进入死信队列 。

    死信交换机其实就是一个正常的交换机,我们可以像申明一个正常交换机一样申明它。

    怎么给队列申明死信交换机?

    rabbitmqctl rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues
    rabbitmqctl (Windows) rabbitmqctl set_policy DLX ".*" "{""dead-letter-exchange"":""my-dlx""}" --apply-to queues

    或者:

    channel.exchangeDeclare("some.exchange.name", "direct");
    
    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-dead-letter-exchange", "some.exchange.name");
    channel.queueDeclare("myqueue", false, false, false, args);
    

    我们也可以给这个交换机申明routingKey:

    args.put("x-dead-letter-routing-key", "some-routing-key");
    

    利用TTL跟死信交换机我们可以实现消息的延时处理:

    大致思路如下:

    1. 声明一个延时处理的队列

      其实就是在申明队列的时候指定消息的存活时间,伪代码如下:

      map.put("x-message-ttl", delayTime);
      
    2. 在申明这个队列时,同时指定死信交换机跟RoutingKey

       map.put("x-dead-letter-exchange", "dead-exchange");
       map.put("x-dead-letter-routing-key", "dead");
       queueDeclare("delay-queue", true, false, false, map)
      
    3. 申明一个队列跟死信交换机绑定,作为死信队列

      queueDeclare("dead-queue", true, false, false, null)
      queueBind("dead-queue", "dead-exchange", "dead", null)
      
  • 相关阅读:
    struts2之JSP与Action的关系
    struts2之基本配置
    Android笔记之BroadCast判断网络状况
    Android笔记之监听左右滑动事件
    Android笔记之转到主线程运行
    springboot项目启动报错 Failed to configure a DataSource: 'url' attribute is not specified and no embedde
    centos6 初次安装成功,未显示eth0网卡的信息
    layerui上传文件
    判断当前浏览器类型
    jquery重置下拉框
  • 原文地址:https://www.cnblogs.com/daimzh/p/12854465.html
Copyright © 2020-2023  润新知