RocketMQ异常:No route info of this topic

一.RocketMQ客户端运行时异常:

exception: 
com.alibaba.rocketmq.client.exception.MQClientException: No route info of this topic, yunlian-truck-websocket-test
See https://github.com/alibaba/RocketMQ/issues/44 for further details.
 at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:587)
 at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1031)
 at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1025)
 at com.alibaba.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:95)
 at com.alibaba.rocketmq.client.producer.DefaultMQProducer$$FastClassBySpringCGLIB$$1b510147.invoke()
 at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
 at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
 at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:97)
 at com.sinochem.yunlian.truck.common.interceptor.MessageProducerInterceptor.Interceptor(MessageProducerInterceptor.java:52)
 at sun.reflect.GeneratedMethodAccessor179.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)


二.异常可能出现的原因:

 原因1:Broker禁止自动创建Topic,且用户没有通过手工方式创建Topic
查看是否允许自动创建topic
#启动./mqbroker -n 127.0.0.1:9876 -p -p是查看配置信息

./mqbroker -n localhost:9876 -p


mq开启自动创建topic参数
方法1: 命令行方式,开启自动创建topic参数

nohup sh mqbroker -n localhost:9876 autoCreateTopicEnable=true &


方法2: 配置文件中,设置 autoCreateTopicEnable=true,配置文件位置:/安装目录/congf
注意启动的时候,根据brokerName,启动不同的配置文件。

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样  例如:在a.properties 文件中写 broker-a  在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128


 原因2:Broker 没有正确连接到 Name Server
查看broker.log日志
位置: /安装目录/conf/logback_broker.xml中日志位置

RocketMQ异常:No route info of this topic_第1张图片

日志信息:broker.log

日志信息:namesrv.log

RocketMQ异常:No route info of this topic_第2张图片
 原因3:Producer 没有正确连接到 Name Server ,防火墙未关闭,导致Producer无法连接到 Name Server
查看防火墙状态

# 查看防火墙状态
systemctl status firewalld

# 打开防火墙,重启后不生效
systemctl start firewalld

#关闭防火墙,重启后不生效
systemctl stop firewalld

# 打开防火墙,重启后也生效
systemctl enable firewalld

#关闭防火墙,重启后不生效
systemctl disable firewalld


防火墙打开状态: active(running)
防火墙关闭状态: active(dead)
防火墙不能关闭,开启RocketMQ指定端口,添加端口后,记得 reload

# 查看防火墙,开放的端口号
firewall-cmd --zone=public --list-ports

# 防火墙为某个端口开放权限,添加首记得重心加载配置
firewall-cmd --zone=public --add-port=80/tcp --permanent

#重新加载防火墙配置
firewall-cmd --reload


 原因4:mq的启动顺序不对(或未启动nameserver只启动了broker),需先启动nameserver,再启动broker
 

#nameserver启动命令
nohup sh mqnamesrv >/usr/local/rocketmq/logs/ns.log &

#broker启动命令,根据不同slave端的brokerName启动不同的配置文件
nohup sh mqbroker -c ../conf/2m-noslave/broker-a.properties > ../logs/mqbroker-a.log 2>&1 &

nohup sh mqbroker -c ../conf/2m-noslave/broker-b.properties > ../logs/mqbroker-b.log 2>&1 &

原因5:rocketmq的版本和rocketmq client的版本不一致导致

使用的rocketmq的版本是4.3.0,java client端版本不对

rocketmq 的 4.3.0版本的自动创建(autoCreateTopicEnable),客户端传递使用的AUTO_CREATE_TOPIC_KEY_TOPIC是”AUTO_CREATE_TOPIC_KEY”
而使用旧版本的client,客户端传递的默认AUTO_CREATE_TOPIC_KEY_TOPIC是“TBW102”

因此,需检查两者的版本是否能对上

替换client的版本


    org.apache.rocketmq
    rocketmq-client
    4.3.0

或者修改以下的值

三.相关Rocketmq命令:


1)查看topicList

sh mqadmin topicList –n localhost:9876

2)查看配置信息

./mqbroker -n localhost:9876 -p

3)查看mq集群状态

sh mqadmin clusterList -n localhost:9876

4)查看topic路由信息

sh mqadmin topicRoute –n localhost:9876 -t yunlian-truck-message-test

5)查看nameserver hosts 配置

vi /etc/hosts

四.控制台查看Rocketmq生产者和消费者连接信息:


1)查看连接信息
Connection→ConsumerConnection

RocketMQ异常:No route info of this topic_第3张图片

2)查看消息是否有积压
Consumer→ConsumerProgress,
只有consumer有积压概念,Diff 单个broker的挤压数,Diff Total 是总的挤压数

RocketMQ异常:No route info of this topic_第4张图片

你可能感兴趣的:(RocketMQ,java面试)