过期时间表示可以为消息设置预期的时间,在这个时间内都可以被消费者接受获取,超过这个时间之后会自定删除
RabbitMQ可以对 消息和队列 设置TTL 有两种方法可以设置
设置TTL
给队列设置过期时间
通过对队列设置属性,队列中的所有消息在时间内都可以被消费,过了时间之后将自动被删除
配置类配置
@Configuration
public class TTLRabbitConfig {
// 声明注册direct模式的交换机
@Bean
public DirectExchange ttlDirectExchange() {
return new DirectExchange("ttl_direct_exchange", true, false);
}
// 设置队列过期时间
@Bean
public Queue ttlQueue() {
//设置队列参数
Map<String, Object> args = new HashMap<>();
//x-message-ttl: 表示过期时间
args.put("x-message-ttl",5000);
return new Queue("ttl_direct_queue",true,false,false,args);
}
// 完成交换机和队列,路由key的绑定
@Bean
public Binding ttlBinding() {
return BindingBuilder.bind(ttlQueue()).to(ttlDirectExchange()).with("ttl");
}
}
测试代码
public boolean ttlDirectOrder(String userId, String productId, Integer num) {
//保存订单业务执行
String orderId = UUID.randomUUID().toString();
log.info("订单业务执行完毕");
log.info("开始异步执行消息分发");
//通过MQ进行消息分发
//定义交换机
String exchangeName = "ttl_direct_exchange";
//消息分发
rabbitTemplate.convertAndSend(exchangeName, "ttl", orderId);
return false;
}
web页面查看
给消息设置过期时间
配置类
@Configuration
public class TTLRabbitConfig {
@Bean
public DirectExchange ttlMessageDirectExchange() {
return new DirectExchange("ttl_message_direct_exchange", true, false);
}
// 设置消息过期时间
@Bean
public Queue ttlMessageQueue() {
return new Queue("ttl_message_direct_queue", true);
}
// 完成交换机和队列,路由key的绑定
@Bean
public Binding ttlMessageBinding() {
return BindingBuilder.bind(ttlMessageQueue()).to(ttlMessageDirectExchange()).with("ttL_message");
}
}
测试代码
public boolean ttlDirectOrderMessage(String userId, String productId, Integer num) {
//保存订单业务执行
String orderId = UUID.randomUUID().toString();
log.info("订单业务执行完毕");
log.info("开始异步执行消息分发");
//通过MQ进行消息分发
//定义交换机
String exchangeName = "ttl_message_direct_exchange";
String routingKey = "ttL_message";
//给消息设置TTL
MessagePostProcessor processor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
//设置过期时间
message.getMessageProperties().setExpiration("5000");
message.getMessageProperties().setContentEncoding("UTF-8");
return message;
}
};
//消息分发
rabbitTemplate.convertAndSend(exchangeName, routingKey, orderId);
return false;
}
关键代码
//给消息设置TTL
MessagePostProcessor processor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
//设置过期时间
message.getMessageProperties().setExpiration("5000");
message.getMessageProperties().setContentEncoding("UTF-8");
return message;
}
};
如果两者都设置了,以最小设置的TTL时间为准
例如:队列设置为5S,消息设置为3S,则过期时间为最小的时间
消息的过期时间过期之后直接删除,队列的过期可以移动到死信队列中