【每天5分钟,了解一个知识点】
在使用 RocketMQ 时,常常会遇到一些生产问题。今天就来聊聊这些问题。
一、初始化生产者实例报错
在使用 RocketMQ Spring Boot Starter 或者 RocketMQ Client 时,可能会出现以下报错:
“The producer service state not OK, maybe started once, RUNNING”
排查分析:这种情况一般是同一个实例调用了多次 start 方法导致的。在 Spring 中,要排查在初始化 bean 时是否主动调用了多次 start 方法,或者是否 Spring 和自己的代码都调用了 start。Spring 可以显式调用,也可以注册 bean 的初始化方法。

“The producer service state not OK, maybe started once, SHUTDOWN_ALREADY”
排查分析:通常是因为调用了 shutdown 方法后,又调用了 start。在 RocketMQ 中,producer 和 consumer 的初始化过程是:初始化+start、shutdown。所以 shutdown 后如果要再次使用,需要重新初始化+start,而初始化过程只有在新建实例的时候才做。


二、topic 路由信息获取不到

topic 不存在或者路由信息获取不到
如果获取到的路由信息为空,客户端会报错。可能是 topic 没有创建,导致没有获取到 topic 信息;也可能是 topic 创建的时候通知 Namesrv 失败了,Namesrv 没有保存这个 topic 的路由信息,查询也就返回空。
解决方法:这种情况可以新建 topic 或者删除后新建,实在不行就重启 namesrv 后再删除新建。
从架构图可以看出,Namesrv 内存中的路由信息是 Broker 定期上报的,如果没有上报或者压根儿没有这个 topic,topic 路由不存在就是预期内的。
发送消息失败
客户端访问 Broker 网络不通:这种情况客户端处理不了,最好找服务维护人员。
发送到 Broker 报错:在确定可以 ping 通 Broker 后,如果 Broker 报错一般会有错误信息,比如超时、broker 磁盘满、broker 同步 slave 失败等,需要根据返回的错误信息排查 Broker 代码。这时把本地“~/logs/rocketmqlogs/rocketmq_client.log”和返回报错信息准备好,交给负责运维 RocketMQ 的同学吧。
【关联阅读】
关注公众号,回复【Java面试】,获取更多面试资料




