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");
    }
}

问题列表以及资料参考

  1. 控制台(http://192.168.1.151:8080)没有集群,没有broker

  2. 控制台(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

  3. 消息生产消费代码参考
    【5张图带你理解 RocketMQ 顺序消息实现机制】 https://blog.csdn.net/zjj2006/article/details/125565668

  4. 发送的消息比实际消费的多,查看控制台显示 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

posted @   Gail_Hu  阅读(416)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示