
# 配置RabbitMQ TTL
TTL（Time To Live）即过期时间。消息在队列中的生存时间超过了TTL后，消息会被丢弃，如果队列设置了死信交换机，丢弃的消息会被转发到死信交换机，由死信交换机将其路由到死信队列。更多关于TTL的说明，请参考[TTL](https://www.rabbitmq.com/ttl.html)。
**TTL是RabbitMQ中需要慎用的特性，它可能会对性能产生负面影响。**
#### 约束与限制
同时设置队列TTL和消息TTL时，以较小的TTL为准。
#### 配置RabbitMQ TTL
RabbitMQ支持设置消息和队列的TTL，消息的TTL可以通过以下两种方法设置：
- 通过队列属性设置：队列中所有消息的具有相同的过期时间。
- 对消息本身单独设置：每条消息可以设置不同的TTL。
 
- [在RabbitMQ控制台设置队列TTL]
  1. 参考[创建RabbitMQ Queue](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq_ug_0029.html)创建队列，并设置"消息过期时间"。
     
     图1设置消息过期时间   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002523905321.png "点击放大")
     
     
  
  2. 在Queue列表中，单击新创建的队列后的"查看详情"，进入"查看详情"页面。 
     当"消息过期时间"显示[1]中设置的时间时，表示队列TTL设置成功。
     图2查看消息过期时间   
     ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0000002491826234.png "点击放大")
     
     
   
- [在Java客户端设置队列TTL]
  通过**channel.queueDeclare** 方法中的"x-expires"参数控制队列被自动删除前处于未使用状态的时间。未使用是指队列中没有任何消费者，也没有被重新声明，并且在过期时间前也未调用过**Basic.Get**命令。"x-expires"参数的值必须为非零整数，单位为ms。
  以下示例演示在Java客户端设置队列TTL。
  ```
  Map<String, Object> args = new HashMap<String, Object>();
  args.put("x-expires", 1800000);   //设置队列TTL为1800000ms
  channel.queueDeclare("myqueue", false, false, false, args);
  ```
- [设置消息TTL]
  - 通过队列属性设置消息TTL： 在**channel.queueDeclare**方法中加入"x-message-ttl"参数，此参数的值必须为非零整数，单位为ms。
    以下示例演示在Java客户端通过队列属性设置消息TTL。
    ```
    Map<String,Object> arg = new HashMap<String, Object>();
    arg.put("x-message-ttl",6000);   //设置队列的消息TTL为6000ms
    channel.queueDeclare("normalQueue",true,false,false,arg);
    ```
    
  
  - 对消息本身单独设置TTL： 在**channel.basicPublish**方法中加入"expiration"参数，此参数的值必须为非零整数，单位为ms。
    以下示例演示在Java客户端对消息本身单独设置TTL。
    ```
    byte[] messageBodyBytes = "Hello, world!".getBytes();
    AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
                                       .expiration("60000")   //设置消息的TTL为60000ms
                                       .build();
    channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);
    ```
    
   
