目录
1.TTL
所谓的ttl,就是过期时间。对于rabbitmq,可以设置队列和消息的过期时间
1.1.设置消息过期时间
(1)相关的交换机和队列
//ttl
@Bean("ttlQueue")
public Queue ttlQueue() {
return QueueBuilder.durable(Constant.TTL_QUEUE).build();
}
@Bean("ttlDirectExchange")
public DirectExchange ttlDirectExchange() {
return ExchangeBuilder.directExchange(Constant.TTL_EXCHANGE).build();
}
@Bean("ttlBinding")
public Binding ttlBinding(@Qualifier("ttlQueue") Queue queue,@Qualifier("ttlDirectExchange") Exchange exchange ) {
return BindingBuilder.bind(queue).to(exchange).with("ttl").noargs();
}
(2)生产者 -- 生产消息的时候设置ttl
给消息设置过期时间,也就是设置消息对象的属性
第一种写法:
//ttl
@RequestMapping("/ttl")
public String ttl() {
MessagePostProcessor postProcessor = new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("10000");//设置10秒后过期
return message;
}
};
rabbitTemplate.convertAndSend(Constant.TTL_EXCHANGE,"ttl","a ttl test",postProcessor);
return "ttl";
}
第二种写法:
//ttl
@RequestMapping("/ttl")
public String ttl() {
rabbitTemplate.convertAndSend(Constant.TTL_EXCHANGE,"ttl","a ttl test",message -> {
message.getMessageProperties().setExpiration("10000");//设置10秒后过期
return message;
});
return "ttl";
}
(3)效果展示
消息在10s后就会自动删除 (本人承诺没有做任何的处理)
(4)设置消息ttl注意事项
设置消息TTL,即时消息过期,也不会马上从队列中删除,而是在即将投递到消费者之前才会进行判定。如果每次都要扫描整个队列就会很低效。
给A消息设置30s过期,B消息设置10s过期,先将消息A存入队列再存B消息,此时B消息30s后才会被删除。
以上的两条消息是同时消失。
1.2.设置队列过期时间
给队列设置TTL,指的是队列中的消息在TTL后就会被删除,而非队列被删除。
(1)设置交换机和队列
代码给队列设置ttl,在创建队列中调用 ttl() 方法即可
//队列ttl
@Bean("ttlQueue2")
public Queue ttlQueue2() {
return QueueBuilder.durable(Constant.TTL_QUEUE2).ttl(20 * 1000).build();//队列中的消息20s后被删除
}
@Bean("ttlDirectExchange2")
public DirectExchange ttlDirectExchange2() {
return ExchangeBuilder.directExchange(Constant.TTL_EXCHANGE).build();
}
@Bean("ttlBinding2")
public Binding ttlBinding2(@Qualifier("ttlQueue") Queue queue,@Qualifier("ttlDirectExchange") Exchange exchange ) {
return BindingBuilder.bind(queue).to(exchange).with("ttl2").noargs();
}
(2)生产者与效果
@RequestMapping("/ttl2")
public String ttl2() {
rabbitTemplate.convertAndSend(Constant.TTL_EXCHANGE,"ttl2","a ttl2");
return "ttl2";
}
给队列设置ttl,在web界面中就会有改效果出现。
如果把设置有ttl的消息发送到设置有ttl的队列中,那么过期时间取值小的一个。
2.死信队列
- 所谓死信,就是因为种种原因无法被消费的消息。
- 所以死信队列,就是用来存放死信的队列。
- 死信到达死信队列的交换机称为DLX(Dead Letter Exchange)
2.1.介绍
(1)死信队列的图解
正常队列中的消息因为一些原因就会变成死信,然后经过一个特定的路由交换,最后到达一个指定的死信队