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());