RocketMQ源码本地搭建调试方法

当你需要对RocketMQ这个消息中间件进行二次开发或者调试的时候,我们需要搭建RocketMQ源码环境,从而可以方便地进行代码调试以及定位问题。接下来,我会为你介绍如何在本地搭建RocketMQ源码的开发环境,并且通过两个示例来演示如何进行调试。

环境准备

在开始搭建RocketMQ源码环境之前,需要您本地已经准备好以下环境:

  1. JDK1.8及以上
  2. Git
  3. Maven
  4. IDE(建议使用IntelliJ IDEA)

步骤1:克隆源代码

首先,我们需要从RocketMQ的Github仓库中将源代码克隆到本地。在终端中执行以下命令:

git clone https://github.com/apache/rocketmq.git

这个命令将会在当前目录下创建一个rocketmq的文件夹,并且下载RocketMQ的源代码到该文件夹中。

步骤2:编译源代码

进入到rocketmq文件夹中,执行以下命令编译源代码:

mvn -Prelease-all -DskipTests clean install -U

这个命令将会对RocketMQ源代码进行编译,并且打包生成相关的jar包。

示例1:如何调试producer发送消息的源码

接下来,我将通过一个示例来说明如何在本地搭建RocketMQ源码开发环境,并且进行代码调试。这个示例的场景是在producer端发送消息的时候调试源代码。

步骤1:启动RocketMQ服务

首先,我们需要启动RocketMQ服务。在终端中进入apache-rocketmq-all模块的bin目录,并且执行以下命令:

sh mqnamesrv

这个命令将会启动namesrv服务。

然后,我们需要在终端中进入apache-rocketmq-all模块的bin目录,并且执行以下命令:

sh mqbroker -n localhost:9876 autoCreateTopicEnable=true

这个命令将会启动broker服务。

步骤2:调试代码

接下来,在IDE中打开RocketMQ的源代码,将producer端的源码添加到我们自己的工程中。

在IDE中打开Producer代码,找到SendMessageService类中的send(…)方法。在代码的第39行添加断点。

public String send(Message msg,
                   SendMessageRequestHeader requestHeader,
                   long timeoutMillis,
                   final CommunicationMode communicationMode,
                   final SendCallback sendCallback) throws InterruptedException, RemotingException {
    ...
    String[] brokerAddrs = new String[4];
    brokerAddrs[0] = "localhost:10911";
    brokerAddrs[1] = "localhost:20911";
    brokerAddrs[2] = "localhost:30911";
    brokerAddrs[3] = "localhost:40911";

    SendResult sendResult = null;
    for (String addr : brokerAddrs) {
        try {
            sendResult = this.sendKernelImpl(msg, requestHeader, addr, timeoutMillis, communicationMode, sendCallback);
            if (sendResult != null) {
                break;
            }
        } catch (Exception e) {
            // log ...
        }
    }

    return sendResult == null ? null : sendResult.getMsgId();
}

然后,在我们自己的工程中调用sendMessage()方法,发送一条消息。当代码运行到我们在sendMessageService类中添加的断点时,IDE会自动进入调试模式,此时我们就可以在IDE中进行断点调试了。

示例2:如何调试Consumer消费消息的源码

接下来,我将通过另外一个示例来介绍如何在本地搭建RocketMQ源码环境,并且进行代码调试。这个示例的场景是在consumer端接收消息的时候调试源代码。

步骤1:启动RocketMQ服务

首先,我们需要启动RocketMQ的服务,与示例1一样,在终端中进入apache-rocketmq-all模块的bin目录,并且执行以下命令:

sh mqnamesrv
sh mqbroker -n localhost:9876 autoCreateTopicEnable=true

步骤2:编写consumer代码

然后,在自己工程中编写consumer代码,找到Consumer的代码,添加branche模块的源代码到自己的工程中。

在本地运行的ConfigureInitializer类中,添加如下代码:

MessageModel messageModel = MessageModel.CLUSTERING;
String consumerGroup = "please_rename_unique_group_name";
ConsumeFromWhere consumeFromWhere = ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET;
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup + "_" + UUID.randomUUID().toString().substring(0, 5), false, j2EESyncPullBridge.getThreadPoolExecutor());
consumer.setMessageModel(messageModel);
consumer.setConsumeFromWhere(consumeFromWhere);
consumer.subscribe("rmq_j2ee_topic", "*");
consumer.setMaxReconsumeTimes(220);
consumer.setPullInterval(60 * 1000);
consumer.setPullBatchSize(32);

Gson gson = new Gson();
rocketMQMessageListener.setOnsListener(new BatchMessageListener() {
    @Override
    public Action consume(List<MessageExt> msgs, ConsumeOrderlyContext context) {
        List<TemplateMessage> resultList = new ArrayList<>();
        for (MessageExt message : msgs) {
            try {
                String messageBody = new String(message.getBody());
                TemplateMessage templateMessage = gson.fromJson(messageBody, TemplateMessage.class);
                resultList.add(templateMessage);
            } catch (Exception e) {
                logger.warn("j2ee callback从mq中拉取消息,解析失败。messageId:" + message.getMsgId());
                return Action.ReconsumeLater;
            }
        }

        return Action.CommitMessage;
    }
});

consumer.registerMessageListener(rocketMQMessageListener);

try {
    consumer.start();
} catch (MQClientException e) {
    e.printStackTrace();
}

步骤3:调试代码

在IDE中打开Consumer的源代码,找到ConsumeMessageService类中的consumeMessageDirectly(…)方法。在代码的第62行添加断点。

public ConsumeMessageDirectlyResult consumeMessageDirectly(//
        final String consumerGroup,//
        final String clientId,//
        final String topic,//
        final String brokerName,//
        final byte[] msgId, //
        final long timeoutMillis,//
        final boolean isUnitMode) throws RemotingException, MQClientException, InterruptedException, MQBrokerException {
    ...
    ConsumeMessageDirectlyResult result = consumeMessageDirectlyResult != null ? JsonUtil.fromJson(consumeMessageDirectlyResult, ConsumeMessageDirectlyResult.class) : null;

    return result;
}

然后,在我们自己的工程中启动consumer,在IDE中执行我们编写的consumer代码,等待consumer接收一条消息。当代码运行到我们在consumeMessageService类中添加的断点时,IDE会自动进入调试模式,此时我们就可以在IDE中进行断点调试了。

总结

通过以上的示例,我们可以看到如何在本地搭建RocketMQ源码环境,并且进行调试。在实际生产环境中,我们往往通过这种方式来解决问题,定位代码bug,并且进行二次开发。但是在实际的开发过程中,我们也需要注意到调试代码对性能的影响,合理地选择调试策略,不要在生产环境中长期调试代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:RocketMQ源码本地搭建调试方法 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 关于提交项目到gitee报错Push to origin/master was rejected的问题

    首先,提交项目到gitee报错“Push to origin/master was rejected”的问题,可能是因为本地代码和远程仓库代码不同步导致的。解决这个问题,需要通过以下步骤: 步骤一:从远程仓库pull代码 首先,我们需要从远程仓库pull代码,更新本地的代码。可以使用以下命令: git pull origin master 其中,origin…

    GitHub 2023年5月16日
    00
  • Git基础知识以及常用命令

    Git 基础知识以及常用命令 什么是 Git Git 是一个分布式版本控制系统,可以用来追踪代码的改变,记录历史版本,合并和管理项目代码等。Git 的核心思想是基于分支的开发流程,利用分支来进行代码开发和测试,最终将分支合并到主分支来发布稳定版本。 安装 Git 在开始使用 Git 前,需要先安装 Git。可以从官网下载适合自己操作系统的版本进行安装,也可以…

    GitHub 2023年5月16日
    00
  • github 生成token的方法图解

    GitHub Token 是一个访问 GitHub API 的令牌,用于进行某些操作,例如用于在 GitHub 上发布问题,创建 Gist,创建或删除存储库等。 为了生成一个 GitHub Token,需要按照以下步骤进行操作: 打开 GitHub 网站,登录到您的账号,并进入“Settings”选项卡 在“Settings”选项卡中,选择“Develope…

    GitHub 2023年5月16日
    00
  • shiro授权的实现原理

    Shiro是一个Java安全框架,提供了身份认证、权限授权、会话管理、加密等功能。Shiro的授权功能通过Realm实现,可以使用基于角色的访问控制(RBAC)、基于资源的访问控制(RBAC模型的细化版)等多种方式来进行授权。 Shiro授权的实现原理可以分为以下几个步骤: 通过配置文件或代码创建Shiro安全管理器SecurityManager,该对象是S…

    GitHub 2023年5月16日
    00
  • go module使用本地包的方法示例

    下面给出使用本地包的方法示例的完整攻略。 使用本地包 在Go的包管理中,依赖的第三方库一般是通过指定包的导入路径获取的,而本地包则需要使用相对或绝对路径进行引用。 示例一:使用相对路径引用本地包 当在项目中引用其他自己写的包时,可以使用相对路径引用本地包。例如,假设你的项目文件布局如下: project/ main.go utils/ utils.go 其中…

    GitHub 2023年5月16日
    00
  • 码云git图文使用详解教程

    码云Git图文使用详解教程 1. 注册并创建仓库 首先访问 码云官网,注册账号并登录。进入个人中心,点击右上角的“新建仓库”按钮,填写相应信息,创建一个新的仓库。 2. 与本地仓库关联 在本地使用 Git 客户端,进入要提交的项目文件夹,使用以下命令将其初始化,并与远程仓库关联: git init git remote add origin https://…

    GitHub 2023年5月16日
    00
  • VUE饿了么树形控件添加增删改功能的示例代码

    下面我将为您详细讲解如何实现VUE饿了么树形控件添加增删改功能的示例代码,这个过程包含两条示例说明。 示例1:如何添加节点 首先,我们需要在vue组件中导入饿了么UI库的el-tree组件,同时引入element-ui的css文件: <template> <el-tree :data="data"></el-…

    GitHub 2023年5月16日
    00
  • Golang Copier入门到入坑探究

    Golang Copier入门到入坑探究 简介 Golang Copier是一款Go语言的结构体复制工具,能够方便快捷地进行结构体复制,并支持复杂数据类型的复制。在本文中,我们将介绍Golang Copier的入门使用、深入探究,并提供两个示例说明。 基本用法 Golang Copier的使用非常简单,可以通过如下代码导入: import "git…

    GitHub 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部