过期时间TTL与死信队列
原创
©著作权归作者所有:来自51CTO博客作者Daylight629的原创作品,请联系作者获取转载授权,否则将追究法律责任
过期时间TTL与死信队列
一、过期时间TTL
过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。
RabbitMQ可以对消息和队列设置TTL。目前有两种方法可以设置。
- 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期 时间。
- 第二种方法是对消息进行单独设置,每条消息TTL可以不同。
如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设
置的TTL值,就称为dead message被投递到死信队列,消费者将无法再收到该消息。
设置
@Bean
public Queue queue5(){
Map<String, Object> args = new HashMap<>();
args.put("x-message-ttl",5000);
return new Queue("queue5",true,false,false,args);
}
@Test
void contextLoads2() throws Exception {
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("dead","","hello springboot-dead",messagePostProcessor);
}
二、死信队列
DLX,全称为Dead-Letter- Exchange ,可以称之为死信交换机,也有人称之为死信邮箱。当消息在一个队列中变 成死信
(dead message)之后,它能被重新发送到另一个交换机中,这个交换机就是DLX,绑定DLX的队列就称之为死信队列。
消息变成死信,可能是由于以下的原因:
DLX也是一个正常的交换机,和一般的交换机没有区别,它能在任何的队列上被指定,实际上就是设置某一个队列的属
性。当这个队列中存在死信时,Rabbitmq就会自动地将这个消息重新发布到设置的DLX上去,进而被路由到另一个队
列,即死信队列。
要想使用死信队列,只需要在定义队列的时候设置队列参数 x-dead- letter-exchange
指定交换机即可。
@Bean
public Queue queue7(){
Map<String, Object> args = new HashMap<>();
args.put("x-message-ttl",5000);
args.put("x-dead-letter-exchange","dead");
return new Queue("queue7",true,false,false,args);
}
@Test
void contextLoads() throws Exception {
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("latte3.fanout","","hello springboot-fanout",messagePostProcessor);
}