起因

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

问题

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

  • 生产者:
            Map<String, Object> paramMap = Maps.newHashMap();paramMap.put("uid", userId);//延迟发送解禁消息到 MQif (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,来实现,这种情况会报错,不会出现立即消费的情况

记一次springcloud stream延迟消息失效相关推荐

  1. Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)

    应用场景 我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者每天凌晨一点执行一次.然而实际业务中还存在另外一种定时 ...

  2. SpringCloud Stream消息驱动

    为啥有这个技术??? 1. 这个stream是操作消息队列的,简化,学习消息队列的成本降低. 2. 可操作rabbitMQ兔子message queue,kafaka,可理解为jdbc可操作oracl ...

  3. RabbitMQ 延迟消息的极限是多少?

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 之前在写Spring Cloud Stream专题内容的时候,特地介绍了一下如何使用Rabb ...

  4. springcloud 相同服务名_SpringCloud系列之SpringCloud Stream

    SpringCloud Stream 技术兴起的原因:为了解决系统中不同中间件的适配问题,出现了cloud stream,采用适配绑定的方式,自动给不同的MQ之间进行切换. 屏蔽底层消息中间件的差异, ...

  5. RabbitMQ延迟消息的极限是多少?

    之前在写Spring Cloud Stream专题内容的时候,特地介绍了一下如何使用RabbitMQ的延迟消息来实现定时任务.最近正好因为开发碰到了使用过程中发现,延迟消息没有效果,消息直接就被消费了 ...

  6. java实现消息队列以及延迟消息(队列DelayQueue)

    1.java实现延迟消息(队列DelayQueue) DelayQueue是一个支持延时获取元素的无界阻塞队列.队列使用PriorityQueue来实现.队列中的元素必须实现Delayed接口,在创建 ...

  7. SpringCloud Stream+RabbitMQ自定义通道

    SpringCloud Stream默认的消息生产通道和消费通道分别是output和input,我们也可以自定义消息生产通道和消费通道:下面对这一过程进行记录. 1 父maven工程 1.1 工程结构 ...

  8. SpringCloud Stream MQ生产和消费同应用造成的同步问题

    我们项目统计模块导出的时候为了达到异步的效果使用了mq来解决,可是producer和consumer是同个应用也就是都是处在一个应用中,之前因为数据少就没有注意异步的效果,改造之后我们模拟了67w的数 ...

  9. redis stream 实现消息队列

    redis stream 实现消息队列 Redis5.0带来了Stream类型.从字面上看是流类型,但其实从功能上看,应该是Redis对消息队列(MQ,Message Queue)的完善实现. 基于r ...

最新文章

  1. Mardown(或Latex)换行
  2. rancher添加私有仓库_CocoaPods搭建私有库
  3. VTK:图片之ImageHistogram
  4. EHCache 初步使用指南
  5. how does local sandbox parse navigation target from hash
  6. 声明式编程与函数式编程_实用程序类与函数式编程无关
  7. jsonp和CORS跨域实现
  8. 【openMV】色块追踪
  9. opc client for php,使用vb/vba作为OPC client
  10. 北京大学生物信息学(3)
  11. try catch 的使用
  12. 用ReadyBoost加速Windows 7
  13. Hexo文章中插入图片的方法
  14. android光谱图软件,光谱精灵精华版Plus
  15. python 百度人脸 sdk_深更半夜实现python百度api人脸识别
  16. hive编写自定义UDF函数
  17. ti最新版akamai的js分析与逆向------002小试牛刀
  18. networkx 判断两图是否同构 得到同构的节点映射
  19. 02 编辑素材和Tilemap
  20. emouse思·睿—评论与观点整理之二

热门文章

  1. python可视化图表插件_组件化可视化图表 - Recharts
  2. android systemui ime_switcher布局冲突
  3. 前端 模块化导入导出方法
  4. softmax函数计算概念,过程。Coursera | Andrew Ng (02-week3-3.9)—训练一个 Softmax 分类器
  5. ARP攻击及ARP绑定实验
  6. STM32F1_WDG看门狗(独立+窗口)
  7. Ubuntu16.04 出现error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES
  8. IPD REL-70-4006
  9. 群晖搭建基于Plex的自动追剧媒体中心
  10. 【洞见研报】无糖食品行业研究报告——最炫“零糖”风,解码无糖食品纵横之路