一、部署前说明
关于MQ选择,在rocketmq和rabbitmq之间,由于之前很多项目都是基于rabbitmq实现,相比rocketmq,对rabbitmq还是更熟悉些。但是这次项目是关于任务管理,每天有不同的任务在不同的时间内需要打卡,超过的需要及时结束当天该任务,换而言之,需要一个延时消息,支持任意时间,很明显rabbitmq的ttl固定时间的方式不合适,在大概了解了rocketmq之后(看到有些文章说支持任意时间的延时消息,有些说只支持固定delayLevel的方式,这个时候对rocketmq还不够了解,为以后集成埋下很多坑),决定以学习的心态,集成rocketmq完成本项目的MQ相关工作。
二、安装部署
关于rocketmq版本的选择,去到官网:https://github.com/apache/rocketmq 看到最新的版本是5.3.3,根据之前的选择原则,不选最新的,也不选最旧的,所以选择了5.2.0版本。对rocketmq的基本安装部署,可以参考: https://rocketmq.apache.org/zh/docs/quickStart/01quickstart 这个就可以,但是需要在云服务器上开启公网访问,所有需要在conf/broker.conf中追加:brokerIP1 = 您的公网IP。如果因为服务器启动报OOM相关的错,需要修改启动的JVM相关的内存参数,适当降低配置,需要修改bin/runbroker.sh和bin/runserver.sh, 根据参考的链接启动后的日志在/root/logs/rocketmqlogs(本机器测试的rocketmq相关日志全都在这里,具体配置还没看,估计应该跟runbroker.sh和runserver.sh中的配置有关)。为了支持外部访问,如rocketmq-dashboard等管理可视化界面工具,对nameserver和broker的启动命令做修改,nameserver启动命名修改成:nohup sh bin/mqnamesrv -n “您的公网IP:9876” &, broker启动命令修改成:nohup sh bin/mqbroker -n 您的公网IP:9876 -c conf/broker.conf autoCreateTopicEnable=true &。
关于rocketmq-dashboard(官方推荐的可视化管控工具,地址:https://rocketmq.apache.org/zh/docs/deploymentOperations/04Dashboard/)的安装,官网有docker镜像和源码两种方式,本人不推荐源码方式,下载下来还得安装maven自行编译,编译还报错:

提示是yarn问题,检查了没有发现,折腾半天都没搞定,果断放弃,使用docker方式。对于docker,自行安装修改/etc/docker/daemon.json修改国内源了,还是无法拉取容器,仍然报官方默认的docker hub地址,这个地址没有魔法是无法访问的,刷新daemon也无效,最后没办法,想到使用宝塔面板,那里可以自行安装docker, 通过这个方式安装的docker, 自动会更新/etc/docker/daemon.json的”registry-mirrors”: [“https://docker.1ms.run”],后面再拉取代码,是能正常。需要注意的是在创建容器的时候,尽量不要用“手动创建”方式,选择“命令创建”的方式,复制官方的容器创建脚本,修改成:docker run -d –name rocketmq-dashboard -e “JAVA_OPTS=-Drocketmq.namesrv.addr=您的公网IP:9876” -p 8080:8080 -t apacherocketmq/rocketmq-dashboard:latest 。rocketmq-dashboard的web端需要调用broker的10909端口。


三、问题处理
后端开发,项目maven引入:rocketmq-spring-boot-starter 版本是2.3.0,因为里面引用的rocketmq-client的版本就是5.2.0,对应的就是rocketmq服务器端安装的5.2.0,尽量保持版本一致,避免带来不必要的坑。请注意,消费者继承RocketMQListener后,需要交给spring容器管理,可以加注解@Component或者构造方式注入等都可以。延时消息的例子如下:


四、开发总结
由于用了宝塔面板,加上华为的云服务器,所以需要在两个地方的安全规则分别开放端口号:8080(rocketmq-dashboard管理后台端口,可以自行修改),9876(rocketmq的nameserver),10911(rocketmq的broker),11011 ,10909(rocketmq的broker)等。网上很多教程包括各种AI大模型给的方案几乎都是基于ocketmq-spring-boot-starter的2.2.0,rocketmq版本是4.8.0, 这个版本是无法支持任意时间的延时消息,只能支持18个level的模式。对rocketmq5的集成方案文章太少了,还找到一篇是自行实现的方案,看完觉得还是自己维护,还不如jdk的ScheduledExecutorService更实在。
