一、问题简述:
1.本地环境中,将消息发送到RDelayQueue中后,等待消息超时后,消息自动到达RBlockQueue中,此时我监听RBlockQueue的代码获取消息并消费成功。
2.生产环境中,只有服务启动,销毁的时候。RDelayQueue中的延时消息才会到达RBlockQueue中。
可以正常发送消息到达redis中的RDelayQueue中,但消息超时后,无法到达RBlockQueue中,故导致监听RBlockQueue的代码获取不到延时消息,无法发布消息事件,导致消费无法被正常消费。
二、依赖版本及redis版本:
1.依赖版本boot2.1.5 redisson3.13.1
2.本地环境redis(win) v2.x 生产环境redis(阿里云资源) v4.x
三、延时队列实现的方案及配置
1.通过yml配置文件的方式配置单机redis(配置参考的官网)
2.BlockQueue(我的延时队列组件名称)初始化后,通过redissonClient获取RDelay和RBlock并赋值给成员变量
2.使用spring task定时任务扫描RBlockQueue中的数据,如果存在则通过事件发布组件(实现了AppcationContextAware接口的类)发布从阻塞队列中获取到的已超时的延时消息,并包装事件发布。
3.消息消费则是通过监听Event,从而获取消息内容进行业务消费。
四、现象
1.本地测试中,发送消息,延时超时,到达阻塞队列,获取消息,封装事件发布,消息监听消费。一整套数据流完全打通。可到生产环境中,就是不行。
本地测试,生产不行,这样的问题开发中遇到过,我解决的方案是:
1.查看本地跟线上依赖包版本是否相同
2.通过日志查看问题具体出现的地方,具体解决
像你这里,先要确定下问题出在哪个环节
Redisson 延迟队列消息“丢失”问题解决
https://blog.csdn.net/dixialieren/article/details/122112976
Redisson 延时队列 延时严重问题
https://zhuanlan.zhihu.com/p/372243682