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日

相关文章

  • 一文带你玩转Golang Prometheus Eexporter开发

    一文带你玩转Golang Prometheus Exporter开发 简介 Prometheus Exporter 实现了一个 HTTP 服务,该服务会在 HTTP 客户端的 /metrics 端点提供度量指标,这些指标是由我们编写的应用程序生成的。在本文中,我们将会详细讲解如何使用 Golang 实现一个 Prometheus Exporter。 实现步骤…

    GitHub 2023年5月16日
    00
  • Android动态绘制饼状图的示例代码

    下面是关于“Android动态绘制饼状图的示例代码”的完整攻略,包含两条示例说明。 示例一:使用Android Graphics绘制饼状图 1. 绘制饼状图基本思路 我们可以通过Android Graphics来绘制饼状图。具体的步骤包括: 根据数据计算每个扇形所占的角度; 根据半径和圆心位置,绘制圆弧; 绘制圆弧上的数据说明。 2. 示例代码 通过如下代码…

    GitHub 2023年5月16日
    00
  • Vue-cli 使用json server在本地模拟请求数据的示例代码

    下面为你详细讲解“Vue-cli 使用json server在本地模拟请求数据的示例代码”的完整攻略,包含两条示例说明。 1. 安装json server 在终端使用npm全局安装json server: npm install -g json-server 安装成功后,可以在终端使用json-server命令启动一个简单的服务器。 2. 创建json数据文…

    GitHub 2023年5月16日
    00
  • 详解如何将本地项目上传到Github的方法步骤(图文)

    以下是详解如何将本地项目上传到Github的方法步骤(图文)的完整攻略,同时包含两条示例说明。 准备工作 在开始上传本地项目到Github之前,需要先进行一些准备工作。 创建Github账号 如果你还没有Github账号,需要先在Github上注册一个账号。打开Github官网(https://github.com/),填写相应信息完成注册。 安装Git G…

    GitHub 2023年5月16日
    00
  • django上传文件的三种方式

    下面我来详细讲解“django上传文件的三种方式”的完整攻略,并提供两个示例说明: 一、使用普通的表单方式上传文件 普通的表单方式上传文件,适用于上传文件较小的情况。 1. 表单页面 首先,需要在前端编写表单页面,其中要包括type为file的input标签,以便用户选择上传文件。 <form action="{% url ‘upload_f…

    GitHub 2023年5月16日
    00
  • npm的安装与使用

    npm的安装与使用攻略 安装npm 首先需要安装Node.js,因为npm是随同Node.js一起安装的。可以从Node.js官网上下载对应的安装包进行安装。 安装完成后,打开命令行工具(terminal)输入以下命令进行验证: node -v npm -v 如果分别输出了Node.js和npm的版本号,则表示安装成功。 npm的基本使用 安装依赖包 使用n…

    GitHub 2023年5月16日
    00
  • Golang学习之平滑重启

    Golang学习之平滑重启 在Golang开发中,应用程序的重启不可避免,常见的复杂业务流程、数据库链接等,都需要重新加载。但是,重新加载会影响应用程序的服务质量,我们期望实现一个“无感知”的平滑重启,本文将介绍Golang平滑重启的实现。 攻略 实现Golang平滑重启需要使用到以下几个步骤: 1. 父进程监听 在平滑重启的实现中,我们使用父进程来监听各个…

    GitHub 2023年5月16日
    00
  • mybatis多个接口参数的注解使用方式(@Param)

    Mybatis是一款优秀的持久化框架,它的优点之一就是支持多数据源和动态SQL,但在使用多数据源时,可能会发现使用同名的mapper.xml进行映射时,出现了问题。此时可以用 @Param 注解来区分同名方法。这里将对多个接口参数的注解使用方式进行详细讲解,并配合两个实例来加深理解。 什么是 @Param 注解 @Param 是 Mybatis 中的注解,表…

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