前言
本想使用rocketmq的延迟消息特性,但延迟的范围有限,仅支持1s 5s 10s 30s1m 2m 3m 4m5m 6m 7m 8m9m 10m 20m 30m1h 2h这18个等级,之外的延迟时间不支持,本文是为了说明如何利用rocketmq的延迟消息实现任意时间的消息延迟,如何进行扩展的
技术架构
![7ffbf3e17134f5e804fb4711da231632.png](https://img-blog.csdnimg.cn/img_convert/7ffbf3e17134f5e804fb4711da231632.png)
rocketmq部署
下载安装包
https://mirror.bit.edu.cn/apache/rocketmq/4.7.0/rocketmq-all-4.7.0-bin-release.zip解压到目录/Users/mengfanxiao/Documents/third_software/mq/rocketmq/rocketmq-all-4.7.0-bin-release
配置Java_home环境变量
sudo vim /etc/profilejdk1.8安装报路径:/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home添加JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home"export JAVA_HOMECLASS_PATH="$JAVA_HOME/lib"
安装nameserver
启动 mqnamesrv
sh bin/mqnamesrv
![74085ffe91e6ce54af7806126822ef74.png](https://img-blog.csdnimg.cn/img_convert/74085ffe91e6ce54af7806126822ef74.png)
安装broker
sh bin/mqbroker -n 127.0.0.1:9876 autoCreateTopicEnable=true -c /Users/mengfanxiao/Documents/third_software/mq/rocketmq/rocketmq-all-4.7.0-bin-release/conf/broker.conf
![84dab9aa5db9700f348fe01cc2001a83.png](https://img-blog.csdnimg.cn/img_convert/84dab9aa5db9700f348fe01cc2001a83.png)
安装console
下载 rocketmq 插件
- 代码下载
https://gitee.com/pingfanrenbiji/rocketmq-externals.git
- 修改配置
vim rocketmq-externals/rocketmq-console/src/main/resources/application.properties
![fa5fffec2548c0ba03ba94ba0cb36f4f.png](https://img-blog.csdnimg.cn/img_convert/fa5fffec2548c0ba03ba94ba0cb36f4f.png)
- 代码编译
进入‘ocketmq-externalsocketmq-console’文件夹,执行‘mvn clean package -Dmaven.test.skip=true’,编译生成
- 启动
编译成功之后,Cmd进入‘target’文件夹,执行‘java -jar rocketmq-console-ng-1.0.1.jar’,启动‘rocketmq-console-ng-1.0.0.jar’。
- 访问控制台页面
![d2b57b8629b67cf9db2a949ab350e6d6.png](https://img-blog.csdnimg.cn/img_convert/d2b57b8629b67cf9db2a949ab350e6d6.png)
吐槽下:页面和rabbitmq相比弱爆了
代码
producer
producer配置
![0fd6973eb4699611eb71268037ba47da.png](https://img-blog.csdnimg.cn/img_convert/0fd6973eb4699611eb71268037ba47da.png)
producer 延迟消息生产流程解析
![f4080a9c424757e99156d5e85fcda459.png](https://img-blog.csdnimg.cn/img_convert/f4080a9c424757e99156d5e85fcda459.png)
![e2600684d9da7563f516cd5822cf6041.png](https://img-blog.csdnimg.cn/img_convert/e2600684d9da7563f516cd5822cf6041.png)
延迟发送逻辑
- 根据延迟时间和当前时间差值计算延迟等级
Integer level = DelayLevelCalculate.calculateDefault(l);
![7d867034fcdf19ffc656de9322a765c9.png](https://img-blog.csdnimg.cn/img_convert/7d867034fcdf19ffc656de9322a765c9.png)
- 标记该消息为延迟消息 希望该消息被消费的时候 若发现是延迟消息即还未到消费的时间 则不消费 再次的触发生产者生产一次该消息
fillMessage(msg, level, startSendTime);
![502e62f54f5144b9cff5374521552187.png](https://img-blog.csdnimg.cn/img_convert/502e62f54f5144b9cff5374521552187.png)
consumer
consumer配置
![c2156c4378c7d05c38f9ee59bd2e3e58.png](https://img-blog.csdnimg.cn/img_convert/c2156c4378c7d05c38f9ee59bd2e3e58.png)
![b2fa3117f95ee8ce89977f4f3ac094e5.png](https://img-blog.csdnimg.cn/img_convert/b2fa3117f95ee8ce89977f4f3ac094e5.png)
consumer 延迟消息消费流程解析
![0153ed64353b945884df5686a0695312.png](https://img-blog.csdnimg.cn/img_convert/0153ed64353b945884df5686a0695312.png)
消息消费逻辑
若发现是延迟消息即还未到消费的时间 则不消费 再次的触发生产者生产一次该消息
参考代码
https://gitee.com/pingfanrenbiji/civism-rocket.git
参考文献
https://www.jianshu.com/p/4f968cd96b87