1.设置队列消息过期时间
@Bean //注入正常交换器
public FanoutExchange normalExchange() {
return new FanoutExchange("NORMAL_EXCHANGE", true, false);
}
@Bean //注入正常队列
public Queue normalQueue() {
Map<String, Object> params = new HashMap<>();
//队列里面的死信会转发到DLX_EXCHANGE交换器上
params.put("x-dead-letter-exchange", "DLX_EXCHANGE");
//队列中的消息超过60秒没被消费,则成为死信
//(这个属性设置要第一次声明队列时才有用,如果队列一开始已存在且没有这个属性,则要删掉队列再重新声明才有用)
params.put("x-message-ttl", 60 * 1000);
return new Queue("MY_QUEUE", true, false, false, params);
}
@Bean //交换机与队列进行绑定
public Binding dlxQueueBind(@Qualifier("normalQueue") Queue queue, @Qualifier("normalExchange") FanoutExchange exchange) {
return BindingBuilder.bind(queue).to(exchange);
}
2.设置单个消息过期时间
MessageProperties properties = new MessageProperties();
//该消息在队列中超过60秒没被消费,则成为死信
properties.setExpiration(60 * 1000 + "");
Message message = MessageBuilder
.withBody("abc".getBody())
.andProperties(properties)
.build();
rabbitTemplate.convertAndSend("NORMAL_EXCHANGE", "NORMAL_ROUTINGKEY", message);
无论用以上哪种方法,都是等消息到达队列头即将要被消费时,才会判断是否过期。
所以对于方法2,可能队列中某个消息已经过期了,但它还没到达队列头部,因此还会停留在队列中。
这种只判断队列头是否过期的方法的优势是,不用时刻扫描整个队列的所有消息去判断哪个过期,这样非常耗资源。