«

RocketMQ报错解决

知叙小硕 发布于 阅读:33


SpringBoot中的报错问题:

第一段:

2025-12-22T14:27:22.092+08:00 ERROR 14636 --- [  XNIO-1 task-2] o.a.r.spring.core.RocketMQTemplate       : syncSend failed. destination:BANK_SHARE_CONFIRM_TOPIC, message:GenericMessage [payload=BankShareConfirmMessage(tenantId=1, origTransId=TID9D94392E5CE933FFEC5A, shareInfo=CP610000000000392568,10000;, msgId=SHR1766384836087), headers={id=33bb771e-7fcd-576f-e754-ed4d68d4755a, timestamp=1766384836087}], detail exception info: 

org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still failed, cost [6005]ms, Topic: BANK_SHARE_CONFIRM_TOPIC, BrokersSent: [broker-a, broker-a, broker-a]
See http://rocketmq.apache.org/docs/faq/ for further details.
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:647) ~[rocketmq-client-4.9.4.jar:4.9.4]
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1363) ~[rocketmq-client-4.9.4.jar:4.9.4]
    at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:352) ~[rocketmq-client-4.9.4.jar:4.9.4]
    at org.apache.rocketmq.spring.core.RocketMQTemplate.syncSend(RocketMQTemplate.java:688) ~[rocketmq-spring-boot-2.2.3.jar:2.2.3]
    at com.joolun.cloud.media.api.controller.UserPayController.pay(UserPayController.java:416) ~[classes/:na]

第二段:

Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to 192.168.0.2:10911 failed
    at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:407) ~[rocketmq-remoting-4.9.4.jar:4.9.4]
    at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:521) ~[rocketmq-client-4.9.4.jar:4.9.4]
    at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:505) ~[rocketmq-client-4.9.4.jar:4.9.4]
    at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:449) ~[rocketmq-client-4.9.4.jar:4.9.4]
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:837) ~[rocketmq-client-4.9.4.jar:4.9.4]

解决方案:

1. 停止现有的RocketMQ服务

cd /mnt/rocketmq/rocketmq-5.3.2

# 停止Broker
sh bin/mqshutdown broker

# 停止NameServer
sh bin/mqshutdown namesrv

# 等待几秒确保进程停止
sleep 5

# 强制杀掉可能残留的进程
pkill -f mqnamesrv
pkill -f mqbroker

2. 创建新的Broker配置

cd /mnt/rocketmq/rocketmq-5.3.2

# 备份原配置
cp conf/broker.conf conf/broker.conf.backup.$(date +%Y%m%d)

# 创建新的broker.conf配置
cat > conf/broker.conf << 'EOF'
# 集群名称
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0

# 文件清理策略
deleteWhen = 04
fileReservedTime = 48

# 主从配置
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH

# 代理配置(RocketMQ 5.x推荐)
enableProxy = true
proxyMode = local

# 关键:指定公网IP(你的云服务器IP)
brokerIP1 = 118.196.16.103

# 自动创建Topic(生产环境建议关闭)
autoCreateTopicEnable = true

# 监听端口(默认)
listenPort = 10911

# NameServer地址
namesrvAddr = 118.196.16.103:9876
EOF

3. 创建启动脚本

# 创建启动脚本
cat > /mnt/rocketmq/start_rocketmq.sh << 'EOF'
#!/bin/bash
ROCKETMQ_HOME=/mnt/rocketmq/rocketmq-5.3.2
LOG_DIR=/root/logs/rocketmqlogs

echo "创建日志目录..."
mkdir -p $LOG_DIR

echo "启动NameServer..."
cd $ROCKETMQ_HOME
nohup sh bin/mqnamesrv > $LOG_DIR/namesrv.log 2>&1 &

echo "等待NameServer启动..."
sleep 5

echo "启动Broker..."
export NAMESRV_ADDR=118.196.16.103:9876
nohup sh bin/mqbroker -n 118.196.16.103:9876 -c conf/broker.conf > $LOG_DIR/broker.log 2>&1 &

echo "等待Broker启动..."
sleep 8

echo "检查启动状态..."
echo "NameServer日志:"
tail -n 5 $LOG_DIR/namesrv.log

echo -e "\nBroker日志:"
tail -n 5 $LOG_DIR/broker.log

echo -e "\n进程状态:"
jps | grep -E 'NamesrvStartup|BrokerStartup'

echo -e "\n集群状态:"
sh bin/mqadmin clusterList -n 118.196.16.103:9876
EOF

# 给启动脚本执行权限
chmod +x /mnt/rocketmq/start_rocketmq.sh

4. 创建停止脚本

# 创建停止脚本
cat > /mnt/rocketmq/stop_rocketmq.sh << 'EOF'
#!/bin/bash
ROCKETMQ_HOME=/mnt/rocketmq/rocketmq-5.3.2

echo "停止RocketMQ服务..."

echo "停止Broker..."
cd $ROCKETMQ_HOME
sh bin/mqshutdown broker

echo "停止NameServer..."
sh bin/mqshutdown namesrv

echo "等待进程停止..."
sleep 3

echo "强制清理残留进程..."
pkill -f mqnamesrv 2>/dev/null || true
pkill -f mqbroker 2>/dev/null || true

echo "检查是否还有相关进程..."
ps aux | grep -E 'mqnamesrv|mqbroker' | grep -v grep

echo "RocketMQ已停止"
EOF

chmod +x /mnt/rocketmq/stop_rocketmq.sh

5. 创建重启脚本

# 创建重启脚本
cat > /mnt/rocketmq/restart_rocketmq.sh << 'EOF'
#!/bin/bash
echo "开始重启RocketMQ..."

# 停止服务
/mnt/rocketmq/stop_rocketmq.sh

# 等待一下
sleep 3

# 启动服务
/mnt/rocketmq/start_rocketmq.sh

echo "RocketMQ重启完成"
EOF

chmod +x /mnt/rocketmq/restart_rocketmq.sh

6. 防火墙配置

# 开放端口(CentOS/RHEL)
firewall-cmd --add-port=9876/tcp --permanent
firewall-cmd --add-port=10911/tcp --permanent
firewall-cmd --reload

# 或者Ubuntu/Debian
# ufw allow 9876/tcp
# ufw allow 10911/tcp
# ufw reload

# 查看开放的端口
firewall-cmd --list-ports

7. 启动RocketMQ

# 执行启动脚本
cd /mnt/rocketmq
./start_rocketmq.sh

8. 验证服务状态

# 检查端口监听
netstat -tlnp | grep -E '9876|10911'

# 检查进程
jps

# 检查集群状态
cd /mnt/rocketmq/rocketmq-5.3.2
sh bin/mqadmin clusterList -n 118.196.16.103:9876

# 测试Topic创建
sh bin/mqadmin updateTopic -n 118.196.16.103:9876 -t BANK_SHARE_CONFIRM_TOPIC

9. Spring Boot应用配置

在你的Spring Boot应用的 application.yml 中配置:

rocketmq:
  name-server: 118.196.16.103:9876
  producer:
    group: your-producer-group
    send-message-timeout: 10000
    # 重要:关闭VIP通道(云服务器必须)
    vip-channel-enabled: false
    # 设置重试次数
    retry-times-when-send-failed: 3

10. 常用命令总结

启动服务:

cd /mnt/rocketmq
./start_rocketmq.sh

停止服务:

cd /mnt/rocketmq
./stop_rocketmq.sh

重启服务:

cd /mnt/rocketmq
./restart_rocketmq.sh

查看日志:

# NameServer日志
tail -f /root/logs/rocketmqlogs/namesrv.log

# Broker日志
tail -f /root/logs/rocketmqlogs/broker.log

检查状态:

cd /mnt/rocketmq/rocketmq-5.3.2
# 查看进程
jps
# 查看集群
sh bin/mqadmin clusterList -n 118.196.16.103:9876

注意事项:

  1. 云服务器安全组:确保在云控制台的安全组中开放 9876 和 10911 端口
  2. 内存配置:如果内存不足,可以编辑 bin/runbroker.sh 调整 -Xms-Xmx 参数
  3. 磁盘空间:确保 /mnt/rocketmq 有足够的磁盘空间

现在按照这个配置,你的RocketMQ应该能够正常工作了!

收到1条评论
avatar
知叙小硕 8 天前
这是我常规部署搭建遇到的问题解决方案
回复