记一次springcloud stream延迟消息失效

起因

实现一个封号功能,可以封1,3,7,30,永久的不同天数,其中1,3,7,30是通过springcloud stream整合rabbitmq的延迟队列来实现,到期自动解封.

问题

当时间设置30天会出现立即解封的情况

  • 生产者:
            Map<String, Object> paramMap = Maps.newHashMap();
            paramMap.put("uid", userId);
            //延迟发送解禁消息到 MQ
            if (lockDays > 0) {

                Message message = MessageBuilder.withPayload(JSON.toJSONString(paramMap)).setHeader("x-delay", 60 * 60 * 24 * 1000 * lockDays).build();
                customSink.doLockoutput().send(message);
            }
  • 消费者:
    @StreamListener(CustomSink.LOCK_INPUT)
    public void loclReceiver(Message msg,@Headers Map headers) {
        String payload = new String(((byte[]) msg.getPayload()));
        Map<String, Object> paramMap = JSON.parseObject(payload, Map.class);
        Long userId = Long.valueOf(paramMap.getOrDefault("uid", "0").toString());
        log.debug("headers{}",headers);
        log.info("发起解锁请求:msg={}, userId={}", msg, userId);
        try {
            int flag = iSysUserService.unLockUser(userId);
            log.info("处理解锁消息: flag={}, userId={}", flag, userId);
        } catch (Exception e) {
            log.error("loclReceiver message exception: {}", e.getMessage());
        }
    }

原因

通过查看headers

{
amqp_receivedDeliveryMode=PERSISTENT, 
amqp_receivedRoutingKey=delay-lock-topic, 
amqp_receivedExchange=delay-lock-topic,
amqp_deliveryTag=1, deliveryAttempt=1, 
amqp_consumerQueue=delay-lock-topic.lock-user, 
amqp_receivedDelay=-1702967296,
amqp_redelivered=false, 
id=eaa38080-5977-921c-a7b8-67950143cf99, 
amqp_consumerTag=amq.ctag-3UBapAhFMzbbTRfuZvIRxQ,
contentType=application/json, 
timestamp=1596440890730
}

发现amqp_receivedDelay=-1702967296,即消息延迟时间
原来当时间设置30天的时候,超过了int的最大值,这时候为负数
在这里插入图片描述

解决方案

在这里插入图片描述
改用long计算

Tips

单独使用rabbitmq,来实现,这种情况会报错,不会出现立即消费的情况

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值