RocketMQ 常见异常处理

MQClientException: No route info of this topic, TopicTest1

异常说明

  • 在客户端的 Producer 运行起来准备发送消息时抛异常如下
  • “ No route info of this topic ” 异常产生的原因可能是,自己当时的原因恰好是第三条:
  1. Broker 禁止自动创建 Topic,且用户没有通过手工方式创建 Topic
  2. Broker 没有正确连接到 Name Server
  3. Producer 没有正确连接到 Name Server 

 
 
  1. 17: 28: 23.123 [main] DEBUG i.n.u.i.l. InternalLoggerFactory - Using SLF4J as the default logging framework
  2. org.apache.rocketmq.client.exception. MQClientException: No route info of this topic, TopicTest1
  3. See http: //rocketmq.apache.org/docs/faq/ for further details.
  4. at org.apache.rocketmq.client.impl.producer. DefaultMQProducerImpl.sendDefaultImpl( DefaultMQProducerImpl.java: 610)
  5. 17: 28: 29.595 [ NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[] result: true
  6. at org.apache.rocketmq.client.impl.producer. DefaultMQProducerImpl.send( DefaultMQProducerImpl.java: 1223)
  7. at org.apache.rocketmq.client.impl.producer. DefaultMQProducerImpl.send( DefaultMQProducerImpl.java: 1173)
  8. at org.apache.rocketmq.client.producer. DefaultMQProducer.send( DefaultMQProducer.java: 214)
  9. at com.lct.quickstart. Producer.main( Producer.java: 56)
  10. at sun. reflect. NativeMethodAccessorImpl.invoke0( Native Method)
  11. at sun. reflect. NativeMethodAccessorImpl.invoke( NativeMethodAccessorImpl.java: 62)
  12. at sun. reflect. DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java: 43)
  13. at java.lang. reflect. Method.invoke( Method.java: 498)
  14. 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 证明是没有问题的

 
 
  1. [ root@localhost apache-rocketmq] # sh ./bin/mqbroker -m
  2. 2018 -08 -12 01\: 27\: 28 INFO main - namesrvAddr=
  3. 2018 -08 -12 01\: 27\: 28 INFO main - brokerIP1= 192.168 .58 .129
  4. 2018 -08 -12 01\: 27\: 28 INFO main - brokerName=localhost.localdomain
  5. 2018 -08 -12 01\: 27\: 28 INFO main - brokerClusterName=DefaultCluster
  6. 2018 -08 -12 01\: 27\: 28 INFO main - brokerId= 0
  7. 2018 -08 -12 01\: 27\: 28 INFO main - autoCreateTopicEnable= true
  8. 2018 -08 -12 01\: 27\: 28 INFO main - autoCreateSubscriptionGroup= true
  9. 2018 -08 -12 01\: 27\: 28 INFO main - rejectTransactionMessage= false
  10. 2018 -08 -12 01\: 27\: 28 INFO main - fetchNamesrvAddrByAddressServer= false
  11. 2018 -08 -12 01\: 27\: 28 INFO main - transactionTimeOut= 3000
  12. 2018 -08 -12 01\: 27\: 28 INFO main - transactionCheckMax= 5
  13. 2018 -08 -12 01\: 27\: 28 INFO main - transactionCheckInterval= 60000
  14. 2018 -08 -12 01\: 27\: 28 INFO main - storePathRootDir=/root/store
  15. 2018 -08 -12 01\: 27\: 28 INFO main - storePathCommitLog=/root/store/commitlog
  16. 2018 -08 -12 01\: 27\: 28 INFO main - flushIntervalCommitLog= 500
  17. 2018 -08 -12 01\: 27\: 28 INFO main - commitIntervalCommitLog= 200
  18. 2018 -08 -12 01\: 27\: 28 INFO main - flushCommitLogTimed= false
  19. 2018 -08 -12 01\: 27\: 28 INFO main - deleteWhen= 04
  20. 2018 -08 -12 01\: 27\: 28 INFO main - fileReservedTime= 72
  21. 2018 -08 -12 01\: 27\: 28 INFO main - maxTransferBytesOnMessageInMemory= 262144
  22. 2018 -08 -12 01\: 27\: 28 INFO main - maxTransferCountOnMessageInMemory= 32
  23. 2018 -08 -12 01\: 27\: 28 INFO main - maxTransferBytesOnMessageInDisk= 65536
  24. 2018 -08 -12 01\: 27\: 28 INFO main - maxTransferCountOnMessageInDisk= 8
  25. 2018 -08 -12 01\: 27\: 28 INFO main - accessMessageInMemoryMaxRatio= 40
  26. 2018 -08 -12 01\: 27\: 28 INFO main - messageIndexEnable= true
  27. 2018 -08 -12 01\: 27\: 28 INFO main - messageIndexSafe= false
  28. 2018 -08 -12 01\: 27\: 28 INFO main - haMasterAddress=
  29. 2018 -08 -12 01\: 27\: 28 INFO main - brokerRole=ASYNC_MASTER
  30. 2018 -08 -12 01\: 27\: 28 INFO main - flushDiskType=ASYNC_FLUSH
  31. 2018 -08 -12 01\: 27\: 28 INFO main - cleanFileForciblyEnable= true
  32. 2018 -08 -12 01\: 27\: 28 INFO main - transientStorePoolEnable= false
  33. [ 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  字样就说明是成功的

 
 
  1. [root@localhost apache-rocketmq]# nohup sh bin/mqbroker -n localhost: 9876 &
  2. [ 2] 3256
  3. [ 1] 退出 143 nohup sh bin/mqbroker -n localhost: 9876
  4. [root@localhost apache-rocketmq]# nohup: 忽略输入并把输出追加到 "nohup.out"
  5. tail -f ~/logs/rocketmqlogs/broker. log
  6. 2018 -08 -11 23: 48: 26 INFO main - load exist subscription group, SubscriptionGroupConfig [groupName=CID_ONSAPI_OWNER, consumeEnable= true, consumeFromMinEnable= true, consumeBroadcastEnable= true, retryQueueNums= 1, retryMaxTimes= 16, brokerId=
  7. 2018 -08 -11 23: 48: 31 WARN main - Load default discard message hook service: DefaultTransactionalMessageCheckListener
  8. 2018 -08 -11 23: 48: 31 INFO FileWatchService - FileWatchService service started
  9. 2018 -08 -11 23: 48: 31 INFO PullRequestHoldService - PullRequestHoldService service started
  10. 2018 -08 -11 23: 48: 31 INFO brokerOutApi_thread_1 - register broker to name server localhost: 9876 OK
  11. 2018 -08 -11 23: 48: 31 INFO main - Start transaction service!
  12. 2018 -08 -11 23: 48: 31 INFO main - The broker[localhost.localdomain, 192.168 .58 .129: 10911] boot success. serializeType=JSON and name server is localhost: 9876
  13. 2018 -08 -11 23: 48: 41 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
  14. 2018 -08 -11 23: 48: 41 INFO BrokerControllerScheduledThread1 - Slave fall behind master: 906412 bytes
  15. 2018 -08 -11 23: 48: 41 INFO brokerOutApi_thread_2 - register broker to name server localhost: 9876 OK
  • 排查3:Producer 没有正确连接到 Name Server 
  • 当时一时糊涂 Linux 上开启了 Broker 端口是 9876,然后自己并没有在防护墙中开启此端口,所以导致客户端 Producer 无论如何也连接不上
  • 如下所示,命令分别含义是:
  1. 查看防护墙开放的端口,此时没有 9876
  2. 设置防火墙开放9876 端口
  3. 重新加载 firewall,修改配置后,必须重新加载才能生效:firewall-cmd --reload 
  4. 再次查看防火墙开放的端口,此时已有 9876

 
 
  1. [root@localhost apache-rocketmq] # firewall-cmd --zone=public --list-ports
  2. 8090/tcp 80/tcp 8080/tcp
  3. [root@localhost apache-rocketmq] # firewall-cmd --zone=public --add-port=9876/tcp --permanent
  4. success
  5. [root@localhost apache-rocketmq] # firewall-cmd --reload
  6. success
  7. [root@localhost apache-rocketmq] # firewall-cmd --zone=public --list-ports
  8. 9876/tcp 8090/tcp 80/tcp 8080/tcp
  9. [root@localhost apache-rocketmq] #

RemotingTooMuchRequestException: sendDefaultImpl call timeout

异常说明

  • 在客户端的 Producer 运行起来准备发送消息时抛异常如下
  • 因为使用的是虚拟机,设置内存也只有1G,所以从 Windows 上开发连接 虚拟机中的 nameServer 时要经过 Linux 系统的防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会关闭这个 TCP 的会话,关闭后再读写,就有可能导致这个异常。

 
 
  1. 16 :22 :37.403 [main] DEBUG i .n .u .i .l .InternalLoggerFactory - Using SLF4J as the default logging framework
  2. 16 :22 :40.994 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address [] result: true
  3. Exception in thread " main" org .apache .rocketmq .remoting .exception .RemotingTooMuchRequestException: sendDefaultImpl call timeout
  4. at org .apache .rocketmq .client .impl .producer .DefaultMQProducerImpl .sendDefaultImpl( DefaultMQProducerImpl .java :588)
  5. at org .apache .rocketmq .client .impl .producer .DefaultMQProducerImpl .send( DefaultMQProducerImpl .java :1223)
  6. at org .apache .rocketmq .client .impl .producer .DefaultMQProducerImpl .send( DefaultMQProducerImpl .java :1173)
  7. at org .apache .rocketmq .client .producer .DefaultMQProducer .send( DefaultMQProducer .java :214)
  8. at com .lct .test .quickStart .Producer .main( Producer .java :28)
  9. at sun .reflect .NativeMethodAccessorImpl .invoke0( Native Method)
  10. at sun .reflect .NativeMethodAccessorImpl .invoke( NativeMethodAccessorImpl .java :62)
  11. at sun .reflect .DelegatingMethodAccessorImpl .invoke( DelegatingMethodAccessorImpl .java :43)
  12. at java .lang .reflect .Method .invoke( Method .java :498)
  13. at com .intellij .rt .execution .application .AppMain .main( AppMain .java :140)
  14. 16 :22 :41.772 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address [] result: true
  15. 16 :23 :11.770 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address [] result: true

解决办法

  • 因为现在主要是熟练 RocketMQ 的 API,所以直接关闭了 Linux 的防火墙,实际中如果买的是如 阿里云的云主机,应该会好一些

 
 
  1. [ root@localhost ~] # systemctl status firewalld
  2. ● firewalld.service - firewalld - dynamic firewall daemon
  3. Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
  4. Active: active (running) since 六 2018 -08 -11 23: 20: 53 CST; 56min ago
  5. Main PID: 877 (firewalld)
  6. CGroup: /system.slice/firewalld.service
  7. └─ 877 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
  8. 811 23: 20: 50 localhost.localdomain systemd[ 1]: Starting firewalld - dynamic firewall.....
  9. 811 23: 20: 53 localhost.localdomain systemd[ 1]: Started firewalld - dynamic firewall ...n.
  10. Hint: Some lines were ellipsized, use -l to show in full.
  11. [ root@localhost ~] #
  • 如上所示防火墙是开的,下面指令关闭防火墙

 
 
  1. [ root@localhost ~] # systemctl stop firewalld
  2. [ root@localhost ~] # systemctl status firewalld
  3. ● firewalld.service - firewalld - dynamic firewall daemon
  4. Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
  5. Active: inactive (dead) since 日 2018 -08 -12 00: 19: 39 CST; 2s ago
  6. Process: 877 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status= 0/SUCCESS)
  7. Main PID: 877 (code=exited, status= 0/SUCCESS)
  8. 811 23: 20: 50 localhost.localdomain systemd[ 1]: Starting firewalld - dynamic firewall.....
  9. 811 23: 20: 53 localhost.localdomain systemd[ 1]: Started firewalld - dynamic firewall ...n.
  10. 812 00: 19: 38 localhost.localdomain systemd[ 1]: Stopping firewalld - dynamic firewall.....
  11. 812 00: 19: 39 localhost.localdomain systemd[ 1]: Stopped firewalld - dynamic firewall ...n.
  12. Hint: Some lines were ellipsized, use -l to show in full.
  13. [ root@localhost ~] #

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值