一.TTL
TTL指的是Msg ttl,Message Time to live,也就是消息过期时间,在RabbitMQ中可以通过设置队列的过期时间或消息的过期时间来实现。
1.设置队列的消息过期时间
//五个参数分别为 队列名 是否持久化 是否私有化 是否自动删除 所带参数
@Bean
Queue ttlQueue(){
Map args = new HashMap();
args.put("x-message-ttl",5000);
return new Queue("ttlQueue",true,false,false,args);
}
通过往args中添加x-message-ttl属性来实现,同样的,也可以在RabbitMQ的网页端去设置,这里只能通过int型来设置过期时间,同时单位为ms。
设置消息过期时间的队列会有一个TTL标识。
2.设置消息的过期时间
MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("5000");
return message;
}
};
rabbitTemplate.convertAndSend("fanoutExchange", "", msg,messagePostProcessor);
通过重写MessagePostProcessor中的postProcessMessage方法来实现,具体为message.getMessageProperties()后设置相关属性。
3.同时设置了消息的过期时间和消息队列的消息的过期时间
在这种情况下,会取两者中的较小值设置消息的过期时间。
二.死信队列
在设置了消息的过期的消息队列中过期的消息,如果设置了死信队列,那么消息将会被转移到对应的死信队列中。由于死信队列也属于队列,所以其转移应遵循正常的分发机制,下面是使用direct模式将过期消息转移到死信队列的案例。
//设置了消息过期时间的队列
@Bean
Queue ttl2Queue(){
Map args = new HashMap();
//指定消息过期时间
args.put("x-message-ttl",5000);
//指定死信队列的路由key
args.put("x-dead-letter-routing-key", "dead");
//指定给死信队列转发消息的交换机
args.put("x-dead-letter-exchange", "directExchange");
return new Queue("ttl2Queue",true,false,false,args);
}
//direct模式的交换机
@Bean
DirectExchange directExchange(){
return new DirectExchange("directExchange",true,false);
}
//绑定死信交换机和死信队列
@Bean
Binding deadBinding(){
return BindingBuilder.bind(deadMsgQueue()).to(directExchange()).with("dead");
}
总的来说,死信队列就是一个用于存放过期消息的队列,需要一个死信交换机来转发消息,与普通的队列无异。