TTL(过期时间)
使用场景
一、队列统一过期
二、消息单独过期
1.maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
2.配置文件yml
server:
port: 8002
spring:
rabbitmq:
host: 192.168.56.101
port: 5672
virtual-host: /ems
username: admin
password: admin
3.配置类,如:队列、交换机等
/**
* @author xiaozikang
* @date 2020/10/13 15:53
* @Email:xiaozikangwy@163.com
*/
@Configuration
public class RabbitmqConfig {
public static final String TTL_EXCHANGE = "ttlExchange";
public static final String TTL_QUEUE = "ttlQueue";
@Bean("ttlExchange")
public Exchange ttlExchange(){
return ExchangeBuilder.directExchange(TTL_EXCHANGE).durable(true).build();
}
@Bean("ttlQueue")
public Queue ttlQueue(){
// 设置队列的统一过期,设置为5秒
Map<String, Object> hashMap = new HashMap<>();
hashMap.put("x-message-ttl",30000);
return QueueBuilder.durable(TTL_QUEUE).withArguments(hashMap).build();
}
@Bean("ttlBinding")
public Binding ttlBinding(
@Qualifier("ttlQueue") Queue ttlQueue,
@Qualifier("ttlExchange") Exchange ttlExchange
){
return BindingBuilder.bind(ttlQueue).to(ttlExchange).with("ttl").noargs();
}
}
4.发送消息
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootRabbitmqProducerTtlApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void contextLoads() {
// 消息后处理对象,设置一些消息的参数信息
MessagePostProcessor messagePostProcessor = new MessagePostProcessor(){
@Override
public Message postProcessMessage(Message message) throws AmqpException {
// 1.给消息设置过期时间
message.getMessageProperties().setExpiration("10000");
// 2.返回该消息
return message;
}
};
rabbitTemplate.convertAndSend(RabbitmqConfig.TTL_EXCHANGE,"ttl","小明,你好",messagePostProcessor);
}
}
总结
1.如果设置了消息的过期时间,也设置了队列的过期时间,它以时间短的为准;
2.队列过期后,会将队列中所有消息全部移除;
3.消息过期后,只有在队列顶端的消息,才会判断其是否过期(移除掉)。