RocketMq源码环境搭建

一、源码下载

可通过github将源码下载到本地,将源码导入到idea中。

二、环境配置

1.配置文件处理

在项目根目录下新建conf目录,将distribution模块中conf目录下的broker.conf、logback_broker.xml及logback_namesrv.xml文件拷贝到新建的conf目录下。
在这里插入图片描述

2.新建存储及日志文件

在项目跟目录下新建/ws/store及/ws/logs目录,用与日志存放及消息存储。
在这里插入图片描述

3.消息配置修改

3.1 修改broker.conf

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
#namesrv地址
namesrvAddr = 127.0.0.1:9876
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
#消息存储路径
storePathRootDir = D:\\coderepo\\sourceCodeReading\\rocketmq\\ws\\store
#CommitLog存储路径
storePathCommitLog = D:\\coderepo\\sourceCodeReading\\rocketmq\\ws\\store\\commitLog
#消息队列存储路径
storePathConsumerQueue = D:\\coderepo\\sourceCodeReading\\rocketmq\\ws\\store\\consumerQueue
#消息索引存储路径
storePathIndex = D:\\coderepo\\sourceCodeReading\\rocketmq\\ws\\store\\index
#Checkpoint 文件存储路径
storeCheckpoint = D:\\coderepo\\sourceCodeReading\\rocketmq\\ws\\store\\checkpoint
#abort文件存储路径
abortFile = D:\\coderepo\\sourceCodeReading\\rocketmq\\ws\\store\\abort

3.2 修改logback_broker.xml

将配置文件中所有的${user.home}替换为新建的日志文件夹。

三、组件启动

1.nameServer启动

1.1配置ROCKETMQ_HOME

配置ROCKETMQ_HOME为项目根目录,例如:

ROCKETMQ_HOME=D:\coderepo\sourceCodeReading\rocketmq

1.2启动nameSrv

右键运行,控制台打印The Name Server boot success. serializeType=JSON代表nameServer启动成功
在这里插入图片描述

2.broker启动

2.1 配置ROCKETMQ_HOME

同nameServer启动配置

2.2 配置启动参数

启动参数增加-c,指定broker配置文件

-c D:\coderepo\sourceCodeReading\rocketmq\conf\broker.conf

2.3启动broker

右键运行,控制台打印The broker[broker-a, 10.1.112.132:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876代表broker启动成功。
在这里插入图片描述

3.生产者启动

在example模块下,找到Producer类,增加nameSvrAddr配置
在这里插入图片描述

public class Producer {
    public static void main(String[] args) throws MQClientException, InterruptedException {

        /*
         * Instantiate with a producer group name.
         */
        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");

        /*
         * 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("127.0.0.1:9876");

        /*
         * Launch the instance.
         */
        producer.start();

        for (int i = 0; i < 1000; i++) {
            try {

                /*
                 * 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);
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }

        /*
         * Shut down once the producer instance is not longer in use.
         */
        producer.shutdown();
    }
}

右键启动,进行消息发送。

4.消费者启动

在example模块下,找到Consumer类,增加nameSvrAddr配置
在这里插入图片描述

public class Consumer {

    public static void main(String[] args) throws InterruptedException, MQClientException {

        /*
         * Instantiate with specified consumer group name.
         */
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4");

        /*
         * 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("127.0.0.1:9876");
        /*
         * Specify where to start in case the specified consumer group is a brand new one.
         */
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

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

右键完成消费者启动。

至此,源码搭建的工作就已经完成。

RocketMQ是一个开源的分布式消息中间件,由阿里巴巴开发,主要用于大规模的消息传输和处理。阅读RocketMQ源码可以帮助你深入了解其内部工作机制、设计模式以及优化策略。以下是阅读RocketMQ源码的一些步骤和关键点: 1. **入门准备**: - 安装必要的依赖:首先需要对Java和相关开发环境(如Maven或Gradle)有一定了解。 - 了解项目结构:熟悉RocketMQ的代码仓库结构,主要包括`mq-client`, `mq-common`, `mq-server`, `mq-externalservice`等主要模块。 2. **理解设计思想**: - 分布式系统设计:研究分区、集群、消息路由、故障恢复机制。 - 消息模型:Consumer Group, Topic, Queue, Orderly Consumers等概念。 - 事务一致性:检查如何处理消息的事务性和持久化。 3. **核心组件**: - **Broker**:查看消息的存储、消费分发、事务管理和高可用性实现。 - **Producer**:了解消息发送流程,包括序列化、路由选择、发送确认机制。 - **Consumer**:研究拉取消费模式和顺序消费的实现。 4. **关键技术实现**: - **Message Queueing(MQ)**:学习如何使用队列来存储和分发消息。 - **Reentrant Locks**:查看并发控制的使用。 - **高可用和容错**:关注心跳检测、主备切换、网络重试策略等。 5. **查阅文档和注释**: - 阅读官方文档、API文档和开发者指南,有助于理解源码中各种类和方法的作用。 - 源码中的JavaDoc是非常重要的参考资料。 6. **实践与问题跟踪**: - 尝试在本地搭建并运行RocketMQ,通过实际操作发现问题。 - 查阅GitHub上的issue和PR,了解社区对源码的讨论和改进。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值