RocketMQ入门探索以及踩坑
前置说明
以下环境使用centos7;没有任何已经启动的服务,8080端口未占用!
下载解压
rocketmq-all-5.1.0-bin-release.zip
安装
- 安装jdk1.8以上(略)
- 配置环境变量
> vi /etc/profile
> source /etc/profile
#export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
#export JAVA_HOME=/usr/local/jdk1.8.0_212
#export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#export JRE_HOME=$JAVA_HOME/jre
export ROCKETMQ_HOME=/var/local/program/rocketmq-5.1.0
export NAMESERV_ADDR=localhost:9876
export PATH=$ROCKETMQ_HOME/bin:$JAVA_HOME/bin:$PATH
- 修改启动内存 nameserver
> vi bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
- 修改启动内存 broker
> vi bin/runbroker.sh
#JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m"
- 启动nameserver
> nohup bin/mqnamesrv >> mqnamesrv.out 2>&1 &
- 修改broker配置
> vi conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 指定brokerIP和nameserverIP
brokerIP1=192.168.1.151
namesrvAddr=192.168.1.151:9876
# 允许自动创建topic
autoCreateTopicEnable=true
# 这个还没有用
#aclEnable=true
- 启动broker
> nohup bin/mqbroker -c ./conf/broker.conf >> broker.out 2>&1 &
- 启动console
下载rocketmq-externals-master.zip,解压,根据readme文件打包
注意:配置文件请根据实际情况修改。
查看配置文件\src\main\resources\application.yml,
默认端口号:8080;
默认namesrvAddrs: 127.0.0.1:9876,127.0.0.2:9876
> mvn clean package -Dmaven.test.skip=true
target目录下将会生成jar包,上传至服务器,java -jar启动即可
target/rocketmq-dashboard-1.0.1-SNAPSHOT.jar
> nohup java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar >> console.out 2>&1 &
成功后访问IP:8080
消息测试
Maven import
注意版本!!!!!!!
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>5.1.0</version>
</dependency>
生产者
SyncProducer.java
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingException;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class SyncProducer {
public static void main(String[] args) throws UnsupportedEncodingException {
try {
DefaultMQProducer producer = new DefaultMQProducer("group_test");
// 注意修改IP!!!
producer.setNamesrvAddr("192.168.1.151:9876");
producer.start();
String[] tags = new String[]{"TagA", "TagB", "TagC", "TagD", "TagE"};
for (int i = 0; i < 10; i++) {
int orderId = i % 10;
Message msg =
new Message("TopicTest", tags[i % tags.length], "KEY" + i,
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
Integer id = (Integer) arg;
int index = id % mqs.size();
return mqs.get(index);
}
}, orderId);
Thread.sleep(1000);
System.out.printf("%s%n", sendResult);
}
producer.shutdown();
} catch (MQClientException | RemotingException | MQBrokerException | InterruptedException e) {
e.printStackTrace();
}
}
}
消费者
SyncConsumer.java
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
public class SyncConsumer {
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group_test");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.subscribe("TopicTest", "TagA || TagC || TagD");
// 注意修改IP
consumer.setNamesrvAddr("192.168.1.151:9876");
consumer.registerMessageListener(new MessageListenerOrderly() {
AtomicLong consumeTimes = new AtomicLong(0);
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
context.setAutoCommit(true);
System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
this.consumeTimes.incrementAndGet();
if ((this.consumeTimes.get() % 2) == 0) {
return ConsumeOrderlyStatus.SUCCESS;
} else if ((this.consumeTimes.get() % 5) == 0) {
context.setSuspendCurrentQueueTimeMillis(3000);
return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
}
return ConsumeOrderlyStatus.SUCCESS;
}
});
consumer.start();
System.out.printf("Consumer Started.%n");
}
}
问题列表以及资料参考
-
控制台(http://192.168.1.151:8080)没有集群,没有broker
-
控制台(http://192.168.1.151:8080)无法新增主题
备注:找到两篇一样的。。。DDDD
【RocketMQ控制台手动新增主题,报错:clusterName or brokerName can not be all blank】
https://blog.csdn.net/hjc2c/article/details/122720444
https://www.65580.net/227157.html -
消息生产消费代码参考
【5张图带你理解 RocketMQ 顺序消息实现机制】 https://blog.csdn.net/zjj2006/article/details/125565668 -
发送的消息比实际消费的多,查看控制台显示 CONSUMED_BUT_FILTERED
【RocketMQ源码解析:消息丢失如何排查】 https://blog.csdn.net/zzti_erlie/article/details/123558837
类型 | 解释 |
---|---|
CONSUMED | 消息已经被消费 |
CONSUMED_BUT_FILTERED | 消息已经投递但被过滤 |
PULL | 消息消费的方式是拉模式 |
NOT_CONSUME_YET | 目前没有被消费 |
NOT_ONLINE | CONSUMER不在线 |
UNKNOWN | 未知错误 |
相关包下载
https://dist.apache.org/repos/dist/release/rocketmq/5.1.0/rocketmq-all-5.1.0-bin-release.zip
https://codeload.github.com/apache/rocketmq-dashboard/zip/refs/heads/master
链接:https://pan.baidu.com/s/1WEbx-Zbr5MUVWzoGjzvuuQ
提取码:o68z
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现