本地编译rocketmq源码

news/2024/12/30 1:14:44/

源码下载

RocketMq下载

运行

在这里插入图片描述
这是rocketmq源码大致的业务分层,本地调试主要是启动nameserver和broker,其他的发送和接收的实现代码可直接使用example包中的官方例子,也可以自己编码代码实现。

  1. 启动namesrv包下的启动类,NamesrvStartup
Connected to the target VM, address: '127.0.0.1:9351', transport: 'socket'
Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ installation
Disconnected from the target VM, address: '127.0.0.1:9351', transport: 'socket'

初次启动的时候它会提示这个异常信息,提示你没有配置ROCKETMQ_HOME变量。
从字面上理解其实就是rocketmq源码在我们磁盘上的一个路径而已。
在这里插入图片描述
只需要在启动配置里面添加上如上配置即可,ROCKETMQ_HOME=你的rocketmq磁盘路径,下面的broker模块启动的时候也要配置上去。

The Name Server boot success. serializeType=JSON, address 0.0.0.0:9876

看到这个就是启动成功了。

  1. 启动broker,运行的是BrokerStartup
xxx boot success. serializeType=JSON

看到这个就是启动成功了。

  1. 运行producer和consumer
    这里运行的不是源码包中的example样例,而是自己实现的producer和consumer。

producer如下:

public static void main(String[] args) {String nameServer = "localhost:9876";DefaultMQProducer defaultMQProducer = new DefaultMQProducer();defaultMQProducer.setNamesrvAddr(nameServer);defaultMQProducer.setProducerGroup("test-group");try {defaultMQProducer.start();String message = "hello";SendResult send = defaultMQProducer.send(new Message("test", message.getBytes()));System.out.println("send hello over");System.out.println(send.getSendStatus());defaultMQProducer.shutdown();} catch (Exception e) {e.printStackTrace();}}

consumer如下:

public static void main(String[] args) {String nameServer = "localhost:9876";DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer();defaultMQPushConsumer.setNamesrvAddr(nameServer);defaultMQPushConsumer.setConsumerGroup("test-consumer-group");try {defaultMQPushConsumer.subscribe("test", (String) null);defaultMQPushConsumer.registerMessageListener(new MessageListenerOrderly() {@Overridepublic ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {for (MessageExt msg : msgs) {String s = new String(msg.getBody());System.out.println(s);}return ConsumeOrderlyStatus.SUCCESS;}});defaultMQPushConsumer.start();TimeUnit.SECONDS.sleep(10);defaultMQPushConsumer.shutdown();} catch (Exception e) {e.printStackTrace();}}

运行producer提示如下异常信息:

**org.apache.rocketmq.client.exception.MQClientException: No route info of this topic: test**
See https://rocketmq.apache.org/docs/bestPractice/06FAQ for further details.at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:718)at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1400)at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1342)at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:351)

从错误信息中可以看到,它是因为没有路由信息,其实说白了就是没有创建这个topic。
在这里插入图片描述
在BrokerStartup类中,如上图位置,添加nameserver的地址即可。

  1. 输出结果
    在这里插入图片描述
    这就是consumer消费的消息。

本地rocketmq可以正常启动以后,就可以按照rocketmq的业务逻辑进行debug调试了,便于我们更好的理解rocketmq的原理。


http://www.ppmy.cn/news/985026.html

相关文章

通过 MongoTemplate 按ID或其他字段删除

按ID删除 mongoTemplate.remove(Query.query(Criteria.where("_id").is("documentId")), MyDocument.class);按其他字段删除 mongoTemplate.remove(Query.query(Criteria.where("fieldName").is("fieldValue")), MyDocument.class);…

如何找回删除的文件?文件恢复,3招就行!

“昨天不小心把我的毕业资料删除了&#xff0c;因为改了很多版&#xff0c;删除的时候没想到把正确的版本删除了&#xff0c;错误的版本还在&#xff01;这种情况应该怎么办呢&#xff1f;怎样才能找回我删除的文件呀&#xff1f;” 对于一些比较重要的文件&#xff0c;不小心删…

argo workflows 配置归档

由于工作需要配置argo workflows归档&#xff0c;介绍一下大致步骤: 文章目录 1.在k8s中是找这个configmap2.编辑configmap3 配置数据库用户名和密码&#xff1a;4.把workflow这个pod删掉&#xff0c;让他重新生成一个 1.在k8s中是找这个configmap kubectl get cm -n argo2.编…

zookeeper学习(一) Standalone模式(单机模式)安装

安装准备 centos7环境jdk1.8环境zookeeper安装包 安装jdk 上传jdk安装包解压安装包到目录中 tar -zxvf jdk-8u361-linux-x64.tar.gz如果需要指定目录可以在后面加上 -C&#xff0c;如 tar -zxvf jdk-8u361-linux-x64.tar.gz -C 目录配置jdk环境变量 vim /etc/profile打开…

C++STL库中的list

文章目录 list的介绍及使用 list的常用接口 list的模拟实现 list与vector的对比 一、list的介绍及使用 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向带头循环链表结构&#xff0c;双向带头循…

网络安全高级课笔记2

一、实例对象 1.对象是单个实物的抽象&#xff0c;是一个容器&#xff0c;封装了属性和方法 2.构造函数&#xff0c;构造函数就是一个普通的函数&#xff0c;但具有自己的特征和用法 var Vehicle function () {this.price 1000; }; 构造函数的特点有两个&#xff1a; 1.…

Mybatis使用collection映射一对多查询分页问题

场景&#xff1a;页面展示列表&#xff0c;需要查询多的字段&#xff0c;和一的字段。并且还要分页。 这时候直接想到的是手写sql。 /*** 标签*/private List<BasicResidentTags> tags;原来的sql 。 <!--一对多映射--><resultMap id"many" type&qu…

JUC高并发编程(二)——Synchronized关键字

文章目录 前言为什么要用Synchronized关键字 并发编程中的三个问题可见性原子性有序性 Synchronized保证三大特性使用synchronized保证可见性使用synchronized保证原子性用synchronized保证有序性 Synchronized的特征可重入特征不可中断特征 前言 synchronized 关键字&#xff…