zoukankan      html  css  js  c++  java
  • 在IDEA上简单搭建RocketMQ源码阅读环境

    本文中,我选择的 RocketMQ 的版本号是 4.8.0

    1.下载源码

    方式一:下载zip包,然后解压到当前文件夹

    方式二:在Git Bash界面克隆指定分支代码

    • 从码云(国内)上克隆分支 rocketmq-all-4.8.0
    git clone -b rocketmq-all-4.8.0 https://gitee.com/apache/rocketmq.git 
    
    • 从Github(国外)上克隆分支 rocketmq-all-4.8.0
    git clone -b rocketmq-all-4.8.0 https://github.com/apache/rocketmq.git
    

    2. 用IDEA打开项目

    1. File -> Open... 打开如下对话框:

    2. Open As Project:

    3.运行NameServer

    namesrv 模块找到类 org.apache.rocketmq.namesrv.NamesrvStartup ,并运行它的 main 函数:

    3.1 缺少环境变量ROCKETMQ_HOME

    运行程序时出现以下报错:

    Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ installation
    

    Run -> Edit Configurations... 打开以下界面:

    你可以把这个值设置成你当前项目目录的路径(例如,我的项目路径是 ROCKETMQ_HOME=F:gitcodegitee ocketmq):

    ROCKETMQ_HOME 表示 RocketMQ 安装的根目录。

    3.2 缺少配置文件logback_namesrv.xml

    再次运行 NamesrvStartup 继续报错:

    ch.qos.logback.core.joran.spi.JoranException: Could not open [F:gitcodegitee
    ocketmqconflogback_namesrv.xml].
    	at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:80)
    	at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:68)
    	at org.apache.rocketmq.namesrv.NamesrvStartup.createNamesrvController(NamesrvStartup.java:119)
    	at org.apache.rocketmq.namesrv.NamesrvStartup.main0(NamesrvStartup.java:57)
    	at org.apache.rocketmq.namesrv.NamesrvStartup.main(NamesrvStartup.java:51)
    

    我们把路径为 项目目录distributionconflogback_namesrv.xml  拷贝到 项目目录conflogback_namesrv.xml  

    3.3 NameServer启动成功

    控制台打印出以下文本,则表示 NameServer 启动成功了:

    The Name Server boot success. serializeType=JSON
    

    4.运行Broker

    broker 模块找到类 org.apache.rocketmq.broker.BrokerStartup ,并运行它的 main 函数:

    4.1 缺少环境变量ROCKETMQ_HOME

    运行程序时出现以下报错:

    Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ installation
    

    还是设置环境变量 ROCKETMQ_HOME,方法同本文 3.1 中的方法,不多赘述。

    在IDEA中为每个程序设置环境变量时,它们的环境变量是相互独立的,因此我们需要设置多次。

    4.2 缺少配置文件logback_broker.xml

    再次运行 BrokerStartup 继续报错:

    ch.qos.logback.core.joran.spi.JoranException: Could not open [F:gitcodegitee
    ocketmqconflogback_broker.xml].
    	at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:80)
    	at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:68)
    	at org.apache.rocketmq.broker.BrokerStartup.createBrokerController(BrokerStartup.java:190)
    	at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)
    

    类似地,我们把路径为 项目目录distributionconflogback_broker.xml  拷贝到 项目目录conflogback_broker.xml  

    4.3 Broker启动成功

    控制台打印如下信息,表示 Broker 启动成功:

    The broker[你的主机名, 你的主机IPv4地址:10911] boot success. serializeType=JSON
    

    5.运行Producer

    example 模块找到类 org.apache.rocketmq.example.quickstart.Producer

    修改 Producer 的代码:

    /*
     * Specify name server addresses.
     * <p/>
     *
     * Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
     * <pre>
     * {@code
     * producer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
     * }
     * </pre>
     */
    producer.setNamesrvAddr("localhost:9876"); // 这行是新增的,namesrv 就启动在本地
    

    运行它的 main 函数...

    5.1 No route info of this topic

    org.apache.rocketmq.client.exception.MQClientException: No route info of this topic: TopicTest
    See http://rocketmq.apache.org/docs/faq/ for further details.
    	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:685)
    	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1343)
    	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1289)
    	at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:325)
    	at org.apache.rocketmq.example.quickstart.Producer.main(Producer.java:67)
    

    这个错误的原因通常有:

    1. Broker禁止自动创建Topic,且用户没有通过手工方式创建Topic
    2. Broker没有正确连接到Name Server
    3. Producer没有正确连接到Name Server

    第三点排除,因为我们已经在代码中明确指定了 Name Server 的地址。

    参考自 《RocketMQ 解决 No route info of this topic 异常步骤》

    5.1.x 指定broker.conf 并重启 BrokerStartup

    我们把路径为 项目目录distributionconfroker.conf  拷贝到 项目目录confroker.conf  

    broker.conf 下面追加以下两个属性:

    namesrvAddr=localhost:9876
    autoCreateTopicEnable=true
    

    autoCreateTopicEnable 默认值就是 true,但是如果是正式的生产环境,会设置为false

    接着,还要在 Run -> Edit Configurations... 修改程序启动参数:

    • 启动参数 -c 项目目录confroker.conf 表示指定配置文件路径:

    • 启动成功后,控制台的打印又多了 Name Server 地址信息:

    The broker[broker-a, 本机IPv4地址:10911] boot success. serializeType=JSON and name server is localhost:9876
    

    5.2 再次运行 Producer

    此次没有异常了,控制台打印了 1000 条 SendResult 的 toString 信息。

    6.运行Consumer

    example 模块找到类 org.apache.rocketmq.example.quickstart.Consumer

    修改 Consumer 的代码:

    /*
     * Specify name server addresses.
     * <p/>
     *
     * Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
     * <pre>
     * {@code
     * consumer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
     * }
     * </pre>
     */
    consumer.setNamesrvAddr("localhost:9876"); // 这行是新增的,namesrv 就启动在本地
    

    运行它的 main 函数...控制台打印 Consumer Started.。接着就是 1000 条 ConsumeMessageThread_数字 Receive New Messages: [MessageExt ... 信息。

    至此,在IDEA上的RocketMQ源码阅读环境搭建成功,且验证成功!

  • 相关阅读:
    python eval lmbda
    python函数--day14-03
    深浅拷贝--day14-02
    数据结构与算法--排序
    数据结构与算法--栈(stack)与队列(queue)
    完全背包的计数问题
    [题解] Codeforces Round #568 (Div. 2) C题题解
    [题解] Codeforces Round #640 (Div. 4) C题 题解
    数据结构——程序设计(一)单链表功能的操作与实现
    [题解] Codeforces Round #708 (Div. 2) C1 题解报告
  • 原文地址:https://www.cnblogs.com/kendoziyu/p/15229018.html
Copyright © 2011-2022 走看看