TTL 超时删除

TTL 超时删除

  • 队列可以设置超时时间
  • 消息可以设置超时时间
  • 以时间短的为准

队列超时

队列设置超时时间的设置办法 和 队列过长删除 一样,只要添加参数 x-message-ttl 单位毫秒

queue.addArgument("x-message-ttl", 20 * 1000);

消息超时

  • 后处理对象 MessagePostProcessor
    public String sendTTL() {
        for (int i = 0; i < 10; i++) {
            String str = "我是第 " + i + " 条消息\t" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss_SSS").format(new Date());
            /**
             * 偶数使用队列的过期时间
             * 奇数使用自定义过期时间
             */
            if (i % 2 == 0) {
                rabbitTemplate.convertAndSend(Constants.MY_TTL_FANOUT_EXCHANGE, "", str);
            } else {
                rabbitTemplate.convertAndSend(Constants.MY_TTL_FANOUT_EXCHANGE, "", str, (message) -> {
                    message.getMessageProperties().setExpiration("5000");
                    return message;
                });
            }
            System.out.println("消息发送成功!\t" + str);
        }
        return "success";
    }

测试

当既设置了队列的过期时间,又设置了消息单独的过期时间,以时间短的为准,但是在控制台上查看可能有点不明显,是因为 RabbitMQ 的删除策略导致的,

如果每秒都遍历所有的消息,查看是否过期,那么对性能的损耗较大,收益较小,RabbitMQ 会将队列的顶端的消息去判断是否过期,如果过期了就删除

假设队列的过期时间30秒,消息过期时间5秒,如上述示例,偶数使用队列的过期时间,奇数使用消息单独设置时间,由于奇数并不在队列顶端,所以奇数消息可能过期了,但是控制台查看还是 10 条,可以将队列设置成 60 秒过期,消息设置成 10 秒过期,不停手动刷新,较为容易的查看效果,或者直接点开控制台查看每条消息。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值