在开发环境下,基于Springboot的RocketMQ示例(含安装步骤、错误分析)

简介: 在看这文章之前建议先看看先前架构原理介绍文章

在看这文章之前建议先看看先前架构原理介绍文章:



RocketMQ服务器启动


linux环境


  1. 下载编译源码


# 下载$ 
  > wget wget http://mirror.bit.edu.cn/apache/rocketmq/4.6.0/rocketmq-all-4.6.0-source- > 
  # 解压$
  >unzip rocketmq-all-4.7.0-source-release.zip
  > cd rocketmq-all-4.7.0/
  # 编译$
  > mvn -Prelease-all -DskipTests clean install -U
  > cd distribution/target/rocketmq-4.7.0/rocketmq-4.7.0
复制代码


  1. 启动 Name Server


# 启动 Name Server 服务
 > nohup sh bin/mqnamesrv &
 # 启动完成后,查看日志$
 > tail -f ~/logs/rocketmqlogs/namesrv.log
  The Name Server boot success...
复制代码


  1. 启动 Broker在 conf 目录下,RocketMQ 提供了多种 Broker 的配置文件:


  • broker.conf :单主,异步刷盘。
  • 2m/ :双主,异步刷盘。
  • 2m-2s-async/ :两主两从,异步复制,异步刷盘。
  • 2m-2s-sync/ :两主两从,同步复制,异步刷盘。
  • dledger/ :Dledger 集群,至少三节点


# 启动 Broker服务
 > nohup sh bin/mqbroker -n localhost:9876 &
 # 启动完成后,查看日志$
 > tail -f ~/logs/rocketmqlogs/broker.log 
  The broker[%s, 172.30.30.233:10911] boot success...
复制代码


其中,参数:


  • 通过 -c 参数,配置读取的主 Broker 配置
  • 通过 -n 参数,设置 RocketMQ Namesrv 地址


  1. 关闭服务器


> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
> sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664
复制代码


windows环境


  1. 首先去官网下载编译之后的版本,然后解压到本地目录


官网链接:rocketmq.apache.org/dowloading/…


下载目标:Binary: [rocketmq-all-4.7.0-bin-release.zip

  1. 配置ROCKETMQ_HOME到系统环境变量中,启动脚本将读取ROCKETMQ_HOME变量


  1. 分别进入bin目录下 启动如下脚本(需要设置内存参数,防止内存过大,启动失败,具体看<常出现的错误>小节):


3.1 启动namesrv


运行命令:


mqnamesrv.cmd
复制代码


log : The Name Server boot success. serializeType=JSON


3.2 启动brokerserver


运行命令:


mqbroker.cmd -n localhost:9876
复制代码


log : The broker[IQSZ-L01898, 10.111.45.111:10911] boot success. serializeType=JSON and name server is localhost:9876

  1. 关闭服务器


mqshutdown.cmd  broker

log:killing name server

mqshutdown.cmd  namesrv

log:killing broker


RocketMQ发送消息和消费消息


RocketMQ发送消息和消费消息,先启动消费者,然后再启动生产者


添加依赖


<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.3.0</version>
</dependency>
复制代码


发送消息


发送消息--同步


public class SyncProducer {
    public static void main(String[] args) throws Exception {
        //Instantiate with a producer group name.
        DefaultMQProducer producer = new
            DefaultMQProducer("test-group");
        // Specify name server addresses.
        producer.setNamesrvAddr("localhost:9876");
        //Launch the instance.
        producer.start();
        for (int i = 0; i < 100; i++) {
            //Create a message instance, specifying topic, tag and message body.
            Message msg = new Message("TopicTest" /* Topic */,
                "TagA" /* Tag */,
                ("Hello RocketMQ " +
                    i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
            );
            //Call send message to deliver message to one of brokers.
            SendResult sendResult = producer.send(msg);
            System.out.printf("%s%n", sendResult);
        }
        //Shut down once the producer instance is not longer in use.
        producer.shutdown();
    }
}
复制代码


发送消息--异步


public class AsyncProducer {
    public static void main(String[] args) throws Exception {
        //Instantiate with a producer group name.
        DefaultMQProducer producer = new DefaultMQProducer("test—group");
        // Specify name server addresses.
        producer.setNamesrvAddr("localhost:9876");
        //Launch the instance.
        producer.start();
        producer.setRetryTimesWhenSendAsyncFailed(0);
        for (int i = 0; i < 100; i++) {
                final int index = i;
                //Create a message instance, specifying topic, tag and message body.
                Message msg = new Message("TopicTest",
                    "TagA",
                    "OrderID188",
                    "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
                producer.send(msg, new SendCallback() {
                    @Override
                    public void onSuccess(SendResult sendResult) {
                        System.out.printf("%-10d OK %s %n", index,
                            sendResult.getMsgId());
                    }
                    @Override
                    public void onException(Throwable e) {
                        System.out.printf("%-10d Exception %s %n", index, e);
                        e.printStackTrace();
                    }
                });
        }
        //Shut down once the producer instance is not longer in use.
        producer.shutdown();
    }
复制代码


发送消息--单向


public class OnewayProducer {
    public static void main(String[] args) throws Exception{
        //Instantiate with a producer group name.
        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
        // Specify name server addresses.
        producer.setNamesrvAddr("localhost:9876");
        //Launch the instance.
        producer.start();
        for (int i = 0; i < 100; i++) {
            //Create a message instance, specifying topic, tag and message body.
            Message msg = new Message("TopicTest" /* Topic */,
                "TagA" /* Tag */,
                ("Hello RocketMQ " +
                    i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
            );
            //Call send message to deliver message to one of brokers.
            producer.sendOneway(msg);
        }
        //Shut down once the producer instance is not longer in use.
        producer.shutdown();
    }
}
复制代码


消费消息


public class Consumer {
    public static void main(String[] args) throws InterruptedException, MQClientException {
        // Instantiate with specified consumer group name.
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test-group");
        // Specify name server addresses.
        consumer.setNamesrvAddr("localhost:9876");
        // Subscribe one more more topics to consume.
        consumer.subscribe("TopicTest", "*");
        // Register callback to execute on arrival of messages fetched from brokers.
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                ConsumeConcurrentlyContext context) {
                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //Launch the consumer instance.
        consumer.start();
        System.out.printf("Consumer Started.%n");
    }
复制代码


常出现的错误


安装中出现的错误


防止内存设置过大


修改runbroker.cmd配置文件

set "JAVA_OPT=%JAVA_OPT% -server -Xms500m -Xmx500m -Xmn500m"

set "JAVA_OPT=%JAVA_OPT% -XX:MaxDirectMemorySize=1g"


31.png


修改runserver.cmd配置文件

set "JAVA_OPT=%JAVA_OPT% -server -Xms500m -Xmx500m -Xmn500m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"


32.png


启动NAMESERVER报错


unrecognized vm option 'MetasoaceSize=128m'


解决方法:更换jdk版本为1.8即可


启动BROKER报错


错误: 找不到或无法加载主类 xxxxxx’


解决方法:打开runbroker.cmd(windows),然后将‘%CLASSPATH%’加上英文双引


使用过程中出现的错误


No route info of this topic


  1. Broker禁止自动创建Topic,且用户没有通过手工方式创建Topic


查看是否允许自动创建topic


命令:mqbroker.cmd -n localhost:9876 -p


mq开启自动创建topic参数


命令:mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true


  1. Broker 没有正确连接到 Name Server


查看broker.log日志


位置: /安装目录/conf/logback_broker.xml中日志位置


日志信息:broker.log


日志信息:namesrv.log


  1. Producer 没有正确连接到 Name Server


linux环境:查询防火墙是否通


错误分析方法


日志分析法:


  1. 查看broker日志


  • 关注broker是否有注册到nameserver


register broker to name server localhost:9876 OK


  • 关注生产者是否连接到broker


new producer connected, group: test_group channel: ClientChannelInfo ...
复制代码


  • 查看已经创建的topic是否包含自己想要的topic


2020-04-21 15:58:22 INFO main - load exist local topic, TopicConfig [topicName=test_group, readQueueNums=1, writeQueueNums=1, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false] ...


  • 查看消费者是否连接到broker


new consumer connected, group: test_group CONSUME_PASSIVELY CLUSTERING channel: ClientChannelInfo ...

  1. 查看nameserver日志


  • 关注broker是否注册到nameserver


new broker registered, localhost:10911


  • 查看topic消息


2020-04-21 17:03:32 INFO RemotingExecutorThread_1 - new topic registered, test_topic QueueData [brokerName=broker-a, readQueueNums=8, writeQueueNums=8, perm=6, topicSynFlag=0]

...


各位看官还可以吗?喜欢的话,动动手指点个💗,点个关注呗!!谢谢支持!



相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
安全 NoSQL Java
SpringBoot接口安全:限流、重放攻击、签名机制分析
本文介绍如何在Spring Boot中实现API安全机制,涵盖签名验证、防重放攻击和限流三大核心。通过自定义注解与拦截器,结合Redis,构建轻量级、可扩展的安全防护方案,适用于B2B接口与系统集成。
1413 3
|
消息中间件 Ubuntu Java
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信
本教程指导在Ubuntu上部署EMQX 5.9.0并集成Spring Boot实现MQTT双向通信,涵盖服务器搭建、客户端配置及生产实践,助您快速构建企业级物联网消息系统。
3279 1
|
消息中间件 架构师 Java
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
|
JavaScript Java 应用服务中间件
基于springboot的学生成绩分析和弱项辅助系统
本系统旨在解决学生成绩分析与弱项辅助信息管理效率低下的问题,通过软件技术实现数据处理的高效化、流程化与规范化,提升管理质量与便捷性。
|
存储 消息中间件 缓存
RocketMQ原理—3.源码设计简单分析下
本文介绍了Producer作为生产者是如何创建出来的、启动时是如何准备好相关资源的、如何从拉取Topic元数据的、如何选择MessageQueue的、与Broker是如何进行网络通信的,Broker收到一条消息后是如何存储的、如何实时更新索引文件的、如何实现同步刷盘以及异步刷盘的、如何清理存储较久的磁盘数据的,Consumer作为消费者是如何创建和启动的、消费者组的多个Consumer会如何分配消息、Consumer会如何从Broker拉取一批消息。
708 11
RocketMQ原理—3.源码设计简单分析下
|
XML 人工智能 IDE
Springboot整合SSMP报错分析
本文介绍了Springboot整合SSMP框架时常见的报错及解决方案,包括MyBatis-Plus版本不兼容导致的Lambda表达式条件构造器报错及表名不匹配问题。通过升级或降级MyBatis-Plus版本、使用@TableName注解或配置table-prefix属性,可有效解决上述问题,帮助开发者避免在整合SSMP时出现不必要的错误。
1097 0
|
消息中间件 Java 数据管理
RocketMQ原理—2.源码设计简单分析上
本文介绍了NameServer的启动脚本、启动时会解析哪些配置、如何初始化Netty网络服务器、如何启动Netty网络服务器,介绍了Broker启动时是如何初始化配置的、BrokerController的创建以及包含的组件、BrokerController的初始化、启动、Broker如何把自己注册到NameServer上、BrokerOuterAPI是如何发送注册请求的,介绍了NameServer如何处理Broker的注册请求、Broker如何发送定时心跳
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
2856 0