过期时间表示可以为消息设置预期的时间,在这个时间内都可以被消费者接受获取,超过这个时间之后会自定删除
RabbitMQ可以对 消息和队列 设置TTL 有两种方法可以设置
设置TTL
给队列设置过期时间
通过对队列设置属性,队列中的所有消息在时间内都可以被消费,过了时间之后将自动被删除
配置类配置
@Configurationpublic class TTLRabbitConfig {// 声明注册direct模式的交换机@Beanpublic DirectExchange ttlDirectExchange() {return new DirectExchange("ttl_direct_exchange", true, false);}// 设置队列过期时间@Beanpublic Queue ttlQueue() {//设置队列参数Map<String, Object> args = new HashMap<>();//x-message-ttl: 表示过期时间args.put("x-message-ttl",5000);return new Queue("ttl_direct_queue",true,false,false,args);}// 完成交换机和队列,路由key的绑定@Beanpublic Binding ttlBinding() {return BindingBuilder.bind(ttlQueue()).to(ttlDirectExchange()).with("ttl");}}
测试代码
public boolean ttlDirectOrder(String userId, String productId, Integer num) {//保存订单业务执行String orderId = UUID.randomUUID().toString();log.info("订单业务执行完毕");log.info("开始异步执行消息分发");//通过MQ进行消息分发//定义交换机String exchangeName = "ttl_direct_exchange";//消息分发rabbitTemplate.convertAndSend(exchangeName, "ttl", orderId);return false;}
web页面查看


给消息设置过期时间
配置类
@Configurationpublic class TTLRabbitConfig {@Beanpublic DirectExchange ttlMessageDirectExchange() {return new DirectExchange("ttl_message_direct_exchange", true, false);}// 设置消息过期时间@Beanpublic Queue ttlMessageQueue() {return new Queue("ttl_message_direct_queue", true);}// 完成交换机和队列,路由key的绑定@Beanpublic Binding ttlMessageBinding() {return BindingBuilder.bind(ttlMessageQueue()).to(ttlMessageDirectExchange()).with("ttL_message");}}
测试代码
public boolean ttlDirectOrderMessage(String userId, String productId, Integer num) {//保存订单业务执行String orderId = UUID.randomUUID().toString();log.info("订单业务执行完毕");log.info("开始异步执行消息分发");//通过MQ进行消息分发//定义交换机String exchangeName = "ttl_message_direct_exchange";String routingKey = "ttL_message";//给消息设置TTLMessagePostProcessor processor = new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {//设置过期时间message.getMessageProperties().setExpiration("5000");message.getMessageProperties().setContentEncoding("UTF-8");return message;}};//消息分发rabbitTemplate.convertAndSend(exchangeName, routingKey, orderId);return false;}
关键代码
//给消息设置TTLMessagePostProcessor processor = new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {//设置过期时间message.getMessageProperties().setExpiration("5000");message.getMessageProperties().setContentEncoding("UTF-8");return message;}};
如果两者都设置了,以最小设置的TTL时间为准
例如:队列设置为5S,消息设置为3S,则过期时间为最小的时间
消息的过期时间过期之后直接删除,队列的过期可以移动到死信队列中
