TTL队列/消息
- TTL是Time To Live的缩写, 也就是生存时间
- RabbitMQ支持消息的过期时间, 在消息发送时可以进行指定
- RabbitMQ支持队列的过期时间, 从消息入队列开始计算, 只要超过了队列的超时时间配置, 那么消息会自动清除
代码演示
- 消费者中设置队列超时时间为10秒, 启动之后关闭消费者
- 生产者发送两条消息, 一条消息不设置超时时间, 一条消息设置5秒后超时
- 启动生产者之后, 监控RabbitMQ控制台, 发现5秒后设置了消息超时时间的消息先超时清除, 然后10秒后另外一条消息也超时清除
package com.qiyexue.api.ttl;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;
import java.util.HashMap;
import java.util.Map;
/**
* 消费者, 设置队列过期时间
*
* @author 七夜雪
* @date 2018-12-13 20:57
*/
public class Consumer {
public static void main(String[] args) throws Exception {
// 1. 创建连接工厂, 设置属性
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.72.138");
factory.setPort(5672);
factory.setVirtualHost("/");
// 2. 创建连接
Connection connection = factory.newConnection();
// 3. 使用connection创建channel
Channel channel = connection.createChannel();
// 4. 声明(创建)一个队列
String queueName = "test_ttl_queue";
Map<String, Object> arguments = new HashMap<>();
// 设置队列超时时间为10秒
arguments.put("x-message-ttl", 10000);
channel.queueDeclare(queueName,true, false, false, arguments);
// 5. 创建消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
// 6. 设置channel
channel.basicConsume(queueName, true, consumer);
while (true) {
// 7. 获取消息
Delivery delivery = consumer.nextDelivery();
System.out.println(new String(delivery.getBody()));
// 获取head中内容
System.out.println(delivery.getProperties().getHeaders().get("name"));
}
}
}
package com.qiyexue.api.ttl;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;
/**
* 生产者
*
* @author 七夜雪
* @date 2018-12-13 20:43
*/
public class Producer {
public static void main(String[] args) throws Exception {
// 1. 创建连接工厂, 设置属性
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.72.138");
factory.setPort(5672);
factory.setVirtualHost("/");
// 2. 创建连接
Connection connection = factory.newConnection();
// 3. 使用connection创建channel
Channel channel = connection.createChannel();
// 4. 通过channel发送消息
String msg = "hello rabbitmq!";
AMQP.BasicProperties properties = new AMQP.BasicProperties();
Map<String,Object> headers = new HashMap<String, Object>();
headers.put("name", "七夜雪");
properties = properties.builder()
// 设置编码为UTF8
.contentEncoding("UTF-8")
// 设置自定义Header
.headers(headers)
// 设置消息失效时间
.expiration("5000").build();
// 设置了消息超时时间为5秒, 5秒后消息自动删除
channel.basicPublish("", "test_ttl_queue", properties, msg.getBytes());
// 没有设置消息存活时间,消息存活时间根据队列来决定
channel.basicPublish("", "test_ttl_queue", null, msg.getBytes());
// 5. 关闭连接
channel.close();
connection.close();
}
}
相关链接
RabbitMQ入门与AMQP协议简介
RabbitMQ成员简介
RabbitMQ高级特性-消息可靠性投递
RabbitMQ高级特性-幂等性保障
RabbitMQ高级特性-Confirm确认消息
RabbitMQ高级特性-Return消息机制
RabbitMQ高级特性-消费端自定义监听
RabbitMQ高级特性-消费端限流
RabbitMQ高级特性-消费端ACK与重回队列
RabbitMQ高级特性-TTL队列/消息
RabbitMQ高级特性-死信队列(DLX)
Spring AMQP整合RabbitMQ
SpringBoot整合RabbitMQ
RabbitMQ集群架构模式介绍
从零开始搭建高可用RabbitMQ镜像模式集群
RabbitMQ集群恢复与故障转移
RabbitMQ-基础组件封装
Git代码地址
慕课网<RabbitMQ消息中间件技术精讲>学习笔记