1、概述
过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。
- 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。
- 第二种方法是对消息进行单独设置,每条消息TTL可以不同。
如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就称为dead message被投递到死信队列, 消费者将无法再收到该消息。
队列设置和消息设置过期的区别
队列设置过期时间,消息过期后会进入死信队列中。消息设置过期时间,消息过期后直接删除
2、队列设置过期时间
@Configuration
public class Config {
@Bean
public DirectExchange directExchange(){
return new DirectExchange("direct_echange",true,false);
}
@Bean
public Queue emailQueue(){
Map<String,Object> args = new HashMap<>();
// 设置过期时间为5S
args.put("x-message-ttl",5000);
return new Queue("email.direct.queue",true,false,false,args);
}
@Bean
public Queue sms(){
return new Queue("sms.direct.queue",true);
}
@Bean
public Binding emailBinding(){
return BindingBuilder.bind(emailQueue()).to(directExchange()).with("email");
}
@Bean
public Binding smsBinding(){
return BindingBuilder.bind(sms()).to(directExchange()).with("sms");
}
}
3、消息设置过期时间
在生产者工程中建立配置类config
@Configuration
public class Config {
@Bean
public DirectExchange directExchange(){
return new DirectExchange("ttl_exchange",true,false);
}
@Bean
public Queue TtlQueue(){
return new Queue("ttl.queue");
}
@Bean
public Binding ttlBinding(){
return BindingBuilder.bind(TtlQueue()).to(directExchange()).with("ttl");
}
}
设置过期时间
@Service
public class OrderService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void send(String msg){
// 设置过期时间
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("5000");
message.getMessageProperties().setContentEncoding("UTF-8");
return message;
}
};
rabbitTemplate.convertAndSend("ttl_exchange","ttl",msg,messagePostProcessor);
}
}
消息传递到队列,五秒后无消费自动删除