Springboot整合RabbitMQ-设置消息过期时间TTL

Java资料站

共 2850字,需浏览 6分钟

 ·

2021-03-14 18:19

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

  作者 |  砒霜拌辣椒

来源 |  urlify.cn/3uiEzq

主要有2种方式:

  1. 指定一条消息的过期时间。

  2. 给队列设置消息过期时间,队列中的所有消息都有同样的过期时间。

1、指定消息的过期时间

@RestController
public class TTLController {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostMapping("/testTTL")
    public String testTTL() {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setExpiration("20000"); // 设置过期时间,单位:毫秒
        byte[] msgBytes = "测试消息自动过期".getBytes();
        Message message = new Message(msgBytes, messageProperties);
        rabbitTemplate.convertAndSend("TTL_EXCHANGE""TTL", message);
        return "ok";
    }
}

消息推送到队列后,如果指定时间内没有被消费,则会自动过期。

注意:
RabbitMQ只会对队列头部的消息进行过期淘汰。如果单独给消息设置TTL,先入队列的消息过期时间如果设置比较长,后入队列的设置时间比较短。会造成消息不会及时地过期淘汰,导致消息的堆积。

2、给队列中的所有消息设置过期时间

@Configuration
public class TTLQueueRabbitConfig {
    @Bean
    public Queue TTLQueue() {
        Map<String, Object> map = new HashMap<>();
        map.put("x-message-ttl", 30000); // 队列中的消息未被消费则30秒后过期
        return new Queue("TTL_QUEUE"truefalsefalse, map);
    }

    @Bean
    public DirectExchange TTLExchange() {
        return new DirectExchange("TTL_EXCHANGE"truefalse);
    }

    @Bean
    public Binding bindingDirect() {
        return BindingBuilder.bind(TTLQueue()).to(TTLExchange()).with("TTL");
    }
}

声明队列时设置1个x-message-ttl的属性,并设置过期时间,凡是推送到该队列中的所有消息,都会有一个30秒后过期的属性。

可以看到创建的队列有TTL的特性,表示该队列中的消息会自动过期。

 

TTL队列

如果同时指定了Message TTLQueue TTL,则优先较小的那一个。

RabbitMQ原生API实现消息自动过期

参考资料

  • RabbitMQ中的过期时间、死信队列、延迟队列

代码地址

  • github:

    https://github.com/senlinmu1008/spring-boot/tree/master/rabbitmq-ttl-dlx

  • gitee:

    https://gitee.com/ppbin/spring-boot/tree/master/rabbitmq-ttl-dlx





粉丝福利:Java从入门到入土学习路线图

👇👇👇

👆长按上方微信二维码 2 秒


感谢点赞支持下哈 

浏览 44
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报