RocketMQ 常见异常处理

本文主要来自https://blog.csdn.net/wangmx1993328/article/details/81588217 我是在这上面又加了自己遇到的问题以及解决办法

MQClientException: No route info of this topic, TopicTest

异常说明

  • 在客户端的 Producer 运行起来准备发送消息时抛异常如下
  • “ No route info of this topic ” 异常产生的原因可能是,下面的三条
  1. Broker 禁止自动创建 Topic,且用户没有通过手工方式创建 Topic
  2. Broker 没有正确连接到 Name Server
  3. Producer 没有正确连接到 Name Server
17:28:23.123 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
org.apache.rocketmq.client.exception.MQClientException: No route info of this topic, TopicTest1
See http://rocketmq.apache.org/docs/faq/ for further details.
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:610)
17:28:29.595 [NettyClientSelector_1] INFO  RocketmqRemoting - closeChannel: close the connection to remote address[] result: true
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1223)
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1173)
	at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:214)
	at com.lct.quickstart.Producer.main(Producer.java:56)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

解决办法

  • 排查1:Broker 禁止自动创建 Topic,且用户没有通过手工方式创建 Topic:
  • 可以在 Rocket_HOME/distribution/target/apache-rocketmq 下执行 " sh bin/mqbroker -m " 来查看 broker 的配置参数
  • 如下所示,autoCreateTopicEnable=true 证明是没有问题的
[root@localhost apache-rocketmq]# sh ./bin/mqbroker -m
2018-08-12 01\:27\:28 INFO main - namesrvAddr=
2018-08-12 01\:27\:28 INFO main - brokerIP1=192.168.58.129
2018-08-12 01\:27\:28 INFO main - brokerName=localhost.localdomain
2018-08-12 01\:27\:28 INFO main - brokerClusterName=DefaultCluster
2018-08-12 01\:27\:28 INFO main - brokerId=0
2018-08-12 01\:27\:28 INFO main - autoCreateTopicEnable=true
2018-08-12 01\:27\:28 INFO main - autoCreateSubscriptionGroup=true
2018-08-12 01\:27\:28 INFO main - rejectTransactionMessage=false
2018-08-12 01\:27\:28 INFO main - fetchNamesrvAddrByAddressServer=false
2018-08-12 01\:27\:28 INFO main - transactionTimeOut=3000
2018-08-12 01\:27\:28 INFO main - transactionCheckMax=5
2018-08-12 01\:27\:28 INFO main - transactionCheckInterval=60000
2018-08-12 01\:27\:28 INFO main - storePathRootDir=/root/store
2018-08-12 01\:27\:28 INFO main - storePathCommitLog=/root/store/commitlog
2018-08-12 01\:27\:28 INFO main - flushIntervalCommitLog=500
2018-08-12 01\:27\:28 INFO main - commitIntervalCommitLog=200
2018-08-12 01\:27\:28 INFO main - flushCommitLogTimed=false
2018-08-12 01\:27\:28 INFO main - deleteWhen=04
2018-08-12 01\:27\:28 INFO main - fileReservedTime=72
2018-08-12 01\:27\:28 INFO main - maxTransferBytesOnMessageInMemory=262144
2018-08-12 01\:27\:28 INFO main - maxTransferCountOnMessageInMemory=32
2018-08-12 01\:27\:28 INFO main - maxTransferBytesOnMessageInDisk=65536
2018-08-12 01\:27\:28 INFO main - maxTransferCountOnMessageInDisk=8
2018-08-12 01\:27\:28 INFO main - accessMessageInMemoryMaxRatio=40
2018-08-12 01\:27\:28 INFO main - messageIndexEnable=true
2018-08-12 01\:27\:28 INFO main - messageIndexSafe=false
2018-08-12 01\:27\:28 INFO main - haMasterAddress=
2018-08-12 01\:27\:28 INFO main - brokerRole=ASYNC_MASTER
2018-08-12 01\:27\:28 INFO main - flushDiskType=ASYNC_FLUSH
2018-08-12 01\:27\:28 INFO main - cleanFileForciblyEnable=true
2018-08-12 01\:27\:28 INFO main - transientStorePoolEnable=false
[root@localhost apache-rocketmq]# 
  • 排查2:Broker 没有正确连接到 Name Server

  • 如下所示,启动 broker 的时候,只要看到了 The broker[localhost.localdomain, 192.168.58.129:10911] boot success. serializeType=JSON and name server is localhost:9876 字样就说明是成功的

  • 排查3:Producer 没有正确连接到 Name Server

  • Linux 上开启了 namesrv 端口是 9876,然后自己并没有在防护墙中开启此端口,所以导致客户端 Producer 无论如何也连接不上

  • 如下所示,命令分别含义是:

  • 查看防护墙开放的端口,此时没有 9876

  • 设置防火墙开放9876 端口

  • 重新加载 firewall,修改配置后,必须重新加载才能生效:firewall-cmd --reload

  • 再次查看防火墙开放的端口,此时已有 9876

[root@localhost apache-rocketmq]# firewall-cmd --zone=public --list-ports
8090/tcp 80/tcp 8080/tcp
[root@localhost apache-rocketmq]# firewall-cmd --zone=public --add-port=9876/tcp --permanent
success
[root@localhost apache-rocketmq]# firewall-cmd --reload
success
[root@localhost apache-rocketmq]# firewall-cmd --zone=public --list-ports
9876/tcp 8090/tcp 80/tcp 8080/tcp
[root@localhost apache-rocketmq]# 

RemotingTooMuchRequestException: sendDefaultImpl call timeout

异常说明

  • 在客户端的 Producer 运行起来准备发送消息时抛异常如下
  • 从 Windows 上开发连接 阿里云服务器中的 nameServer 时要经过 Linux 系统的防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会关闭这个 TCP 的会话,关闭后再读写,就有可能导致这个异常。

解决办法

  • 直接关闭了 Linux 的防火墙
root@iZ2zefh3zfkuq7g1v7dpiwZ:~/www/software/rocketmq/rocketmq/bin# firewall-cmd --state
running
root@iZ2zefh3zfkuq7g1v7dpiwZ:~/www/software/rocketmq/rocketmq/bin# systemctl stop firewalld
root@iZ2zefh3zfkuq7g1v7dpiwZ:~/www/software/rocketmq/rocketmq/bin# firewall-cmd --state
not running
root@iZ2zefh3zfkuq7g1v7dpiwZ:~/www/software/rocketmq/rocketmq/bin# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Sun 2020-03-01 11:08:36 CST; 13s ago
 Main PID: 30277 (code=exited, status=0/SUCCESS)

Feb 29 00:40:34 iZ2zefh3zfkuq7g1v7dpiwZ /firewalld[30277]: ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -D FORWARD -i doc
Feb 29 00:40:34 iZ2zefh3zfkuq7g1v7dpiwZ /firewalld[30277]: ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C FORW
Feb 29 00:40:34 iZ2zefh3zfkuq7g1v7dpiwZ /firewalld[30277]: ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C FORW
Feb 29 00:40:34 iZ2zefh3zfkuq7g1v7dpiwZ /firewalld[30277]: ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t nat -C PREROUT
Feb 29 00:40:34 iZ2zefh3zfkuq7g1v7dpiwZ /firewalld[30277]: ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t nat -C OUTPUT 
Feb 29 00:40:34 iZ2zefh3zfkuq7g1v7dpiwZ /firewalld[30277]: ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C FORW
Feb 29 00:40:34 iZ2zefh3zfkuq7g1v7dpiwZ /firewalld[30277]: ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C FORW
Feb 29 00:40:34 iZ2zefh3zfkuq7g1v7dpiwZ /firewalld[30277]: ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C FORW
Mar 01 11:08:34 iZ2zefh3zfkuq7g1v7dpiwZ systemd[1]: Stopping firewalld - dynamic firewall daemon...
Mar 01 11:08:36 iZ2zefh3zfkuq7g1v7dpiwZ systemd[1]: Stopped firewalld - dynamic firewall daemon.

MQClientException: send message Exception

该问题与上边的问题一起出现的,关闭了防火墙就好了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值