RocketMq灰皮书(三)------MQ使用
RocketMq灰皮书(三)------MQ使用
在使用MQ之前,我们回顾一下前两篇博文的内容.
- 我们大致了解了
RocketMQ的四个概念,分别是:Producer,Consumer,Message和Broker - 我们在本地的Windows10系统上,部署了
RocketMQ和其后台系统
在本篇博文中,我们会使用使用SpringBoot构建两个微服务,一个作为生产者,一个作为消费者,通过RocketMQ传递消息,了解在Java中使用RocketMQ的方法.
一. SpringBoot整合RocketMQ收发消息
在灰皮书第一篇文章中,我画了下面这个图:

现在我们本地的RocketMQ也部署起来了,接下来我们创建两个微服务通过MQ来收发消息,实现基本的流程.
1. 微服务构建
首先我们创建两个基于SpringBoot的微服务,分别是:
rocketmq-consumer消息消费者rocketmq-producer消息生产者

两个服务里面,rocketmq-consumer的端口号是2001,rocketmq-producer的端口号是2002
2. 微服务启动测试
分别在两个微服务写两个测试方法,启动测试:
rocketmq-consumer
@RestController
public class ConsumerController {
@GetMapping("/consumer")
public String index() {
return "rocketmq-consumer";
}
}
rocketmq-producer
@RestController
public class ProducerController {
@GetMapping("/producer")
public String index() {
return "rocketmq-producer";
}
}
启动测试,两个接口都成功访问.
根据我们最上面的图,服务A发送消息到服务B,在这里,我们用rocketmq-producer来发送消息,消息发送到rocketmq以后,由服务Brocketmq-consumer消费消息.
3. 生产者发送消息
使用rocketmq发送消息有很多种方式,因为我们使用的是SpringBoot,这里直接使用官方提供的rocketmq-spring-boot-starter包来开发
在github上有个项目:RocketMQ-Spring
它就是RocketMq官方提供的整合了SpringBoot的rocketmq工具包,git地址如下:https://github.com/apache/rocketmq-spring
当然,你也可以使用原生的rocketmq-client包,在官方的示例中,使用的就是这种方式,具体可以查看官方文档,下面我们直接使用rocketmq-spring-boot-starter来发送消息.
我们可以看到有很多的版本可以用:

这里我们使用2.0.3这个版本吧,具体的官方细节可以查看https://github.com/apache/rocketmq-spring/blob/release-2.0.3/README_zh_CN.md
3.1发送String消息
首先是pom坐标:
<!--add dependency in pom.xml-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
然后再rocketmq-producer的配置文件中配置rocketmq的name-server和group
## application.properties
rocketmq.name-server=127.0.0.1:9876
rocketmq.producer.group=producer
rocketmq-spring-boot-starter中提供了一个RocketMQTemplate来方便我们发送消息,我们可以直接注入这个类来使用.
RocketMQTemplate有send方法和convertAndSend方法,都可以用来发送消息,区别是,前者的方法入参是rocketmq规定的Message类型,而后者可以发送对象,并且帮我们转换,源码如下:
/**
* Send a message to the given destination.
* @param destination the target destination
* @param message the message to send
*/
void send(D destination, Message<?> message) throws MessagingException;
/**
* Convert the given Object to serialized form, possibly using a
* {@link org.springframework.messaging.converter.MessageConverter},
* wrap it as a message and send it to a default destination.
* @param payload the Object to use as payload
*/
void convertAndSend(Object payload) throws MessagingException;
下面我们直接发送消息到mq
@Autowired
private RocketMQTemplate rocketMQTemplate;
@GetMapping("/producer")
public String index() {
rocketMQTemplate.convertAndSend("test-topic", "消息发送成功!");
return "rocketmq-producer";
}
convertAndSend方法有两个参数,第一个参数是消息要发送到的topic,也就是目的地,第二个参数就是消息本身,至于topic到底是什么,这个我们后面详细来说,我们只需要知道,我们的消息发送到了rocketmq的一个叫做test-topic的地方即可.
并且,由于我们在灰皮书第二章的时候,启动mq的时候,指定了autoCreateTopicEnable=true,也就是说,我们使用RocketMQTemplate发送的消息,就算topic之前不存在,rocket也会帮我们创建好.
编码完成,重启项目,我们只要访问http://localhost:2002/producer就会发送消息到mq,我们可以通过rocketmq-console查看我们发送的消息
可以看到mq自动为我们创建了topic:

在message页签,可以查看到我们刚才发送的消息:

详细的消息内容:

3.2发送对象
在上面的例子中,我们直接发送字符串到MQ,一般来说,我们发送的消息体是一个java对象,在这里也是可以的,我们改造一下代码:
@GetMapping("/producer")
public String index() {
rocketMQTemplate.convertAndSend("test-topic", new User("张三", 20));
return "rocketmq-producer";
}
@Data
class User implements Serializable {
private static final long serialVersionUID = -3486413003967431764L;
private String name;
private Integer age;
User() {}
User(String name, Integer age) {
this.name = name;
this.age = age;
}
}
这样我们发送了一个User对象到RocketMQ中,我们再去rocketmq-console查看:

可以看到,消息成功发送到了mq中,需要注意的是,这里我们发送的对象要实现Serializable接口,不然会抛异常.
那么我们发送的消息的内容是怎么序列化的呢?
RocketMQ的消息体都是以
byte[]方式存储的,如果内容体是java.lang.String类型时,统一按照UTF-8编码转成byte[];如果消息内容不是String类型的,则采用jackson-databind序列化成JSON格式的字符串后,再统一按照UTF-8编码转换成byte[]
以上释义源于RocketMQ官方文档,所以说,有问题多看看官方文档能很大程度上解决我们的疑惑!
4. 消费消息
好了,我们的消息发送成功了,接下来我们在rocketmq-consumer应用中消费之前发送出来的消息.
在开发之前我们先想一下: 消息的生产者随着用户的请求,不断的往MQ中发送消息,那么消费者在消费消息的时候,是怎么知道它要取哪一条消息呢?
我们之前的文章中提到过一个topic,生产者在发送消息的时候,会指定一个topic,消息会发送到某个topic下,那么自然而然的,消费者在获取消息的时候,也是需要知道它要从哪个topic里面去获取消息的.
而获取消息,则是通过监听器来完成的.
创建一个监听器:
@Component
@RocketMQMessageListener(topic = "test-topic", consumerGroup = "consumer")
@Slf4j
public class Consumerlistener implements RocketMQListener<User> {
@Override
public void onMessage(User message) {
log.info("收到消息 : {}", message);
}
}
@RocketMQMessageListener注解中我们指定了2个参数:
- topic 指定监听器要监听的topic,监听器运行以后,会一直监听该topic下的消息
- consumerGroup 指定当前消费者是数据哪个消费组,这个概念我们后面会详细说
其次,我们自定义的监听器还要实现RocketMQListener<T>接口,该接口的泛型类型就是我们生产者发送消息的消息类型,之前我们发送的是User对象,因此这里也是User对象
实现RocketMQListener接口的onMessage方法,方法的入参就是我们发送出来的消息,在这个方法中我们可以进行自己的业务处理.
启动服务rocketmq-consumer,可以看到正常消费到了消息:

以上,我们成功的在我们的微服务中使用RocketMQ进行了消息的发送和消费.
不仅仅是简单的消息,RocketMQ还支持更高级的功能,比如事务消息、消息轨迹等,这些高级特效我们会下后面的进阶文章中详细讲解.
结语:
在本篇博文中,我们使用RocketMQ官方提供的pom包进行了消息的发送和接收,也成功的在rocketmq-console中查看到了消息.
在这个工程中,我们接触了很多新的概念:
- topic
- consumerGroup
以上这些概念,以及前面篇文章中遗留下来的概念,我们将在下一篇文章中详细介绍.
个人公众号<橙耘自留地>日前已经开通,后续博主发布的文章都会一并更新到公众号,如有需要,自行查阅.
关于橙耘自留地,是我个人聚焦互联网技术栈学习分享的一个平台,创立之初是因为目前业内各种技术课程资料层次不齐,褒贬不一,有时候一门课花费高价买入,其实内含草包,有时偶尔低价得之,却又大有干货.因此我会根据大家的意见和评价,选择不同的技术栈去学习,一为提升我自己的技术,二为大家梳理出质量比较好的课程,以作参考.同时,相关的学习心得也会一并更新到博客和公众号.

RocketMq灰皮书(三)------MQ使用的更多相关文章
- RocketMq灰皮书(二)------本地部署启动MQ
RocketMq灰皮书(二)------本地部署启动MQ Windows10本地部署RocketMQ 在上一篇文章中,我们对rocket的几个基本概念进行了介绍,也了解了业内几大消息中间件的区别.在本 ...
- RocketMq灰皮书(一)------选型&RocketMQ名词
RocketMq灰皮书(一)------选型&RocketMQ名词 一. MQ选型对比 目前业内常用的MQ框架有一下几种: Kafka RabbitMQ RocketMQ 除此之外,还有Act ...
- RocketMQ详解(三)启动运行原理
专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...
- 【rocketMQ】1、搭建MQ服务器,生产一个订单与消费一个订单
1. 先解压 2. maven编译安装.(注意虚拟机采用nat网络模式,需要联网) mvn -Prelease-all -DskipTests clean install -U 启动nameser节点 ...
- RocketMQ读书笔记4——NameServer(MQ的协调者)
[NameServer简述] 对于一个消息队列集群来说,系统由很多机器组成,每个机器的角色.IP地址都不相同,而且这些信息是变动的(如在某些情况下,会有新的Producer或Consumer加入). ...
- 微服务异步架构---MQ之RocketMQ
“我们大家都知道把一个微服务架构变成一个异步架构只需要加一个MQ,现在市面上有很多MQ的开源框架.到底选择哪一个MQ的开源框架才合适呢?” 一.什么是MQ?MQ的原理是什么? MQ就是消息队列,是Me ...
- RocketMQ 4.7.1 环境搭建、集群、MQ整合SpringBoot
导读 之前学过ActiveMQ但是并发量不是很大点我直达,所以又学阿里开源的RocketMQ,据说队列可以堆积亿级别.下面是网上找的消息队列对比图,仅供参考 部署 官网 点我直达 前置条件 推荐使用6 ...
- RocketMQ学习分享
消息队列的流派 什么是 MQ Message Queue(MQ),消息队列中间件.很多人都说:MQ 通过将消息的发送和接收分离来实现应用程序的异步和解偶,这个给人的直觉是——MQ 是异步的,用来解耦的 ...
- 《浅入浅出》-RocketMQ
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点脑图.个人联系方式和技术交流群,欢迎Star和指 ...
随机推荐
- react报错 TypeError: Cannot read property 'setState' of undefined
代码如下: class test extends Component { constructor(props) { super(props); this.state = { liked: false ...
- ModelArts 与HiLens Kit联合开发丨行人社交距离风险提示Demo
摘要:本Demo使用YOLOv3_Resnet18模型来检测的视频流中的行人,获取行人坐标(即图中蓝色方框),然后计算所有检测到的人之间的相互"距离". 前情提要 听到行人社交距离 ...
- ShowDoc,APIDoc,可道云API,语雀-适合IT企业的文档工具
ShowDoc,APIDoc,可道云API,语雀-适合IT企业的文档工具 一.ShowDoc官方文档及说明 1.1 它可以用来做什么 1.2 它都有些什么功能 1.3 使用在线的ShowDoc 1.4 ...
- jQuery基础介绍
最近在学习JavaScript,当学习Javascript之后,不得不学习的肯定是jQuery了,所以开始利用网络的便捷浏览各大博客寻找可学习的资源.这篇博客关于jQuery的学习让我有很多收获,也明 ...
- SpringBoot - 实现文件上传1(单文件上传、常用上传参数配置)
Spring Boot 对文件上传做了简化,基本做到了零配置,我们只需要在项目中添加 spring-boot-starter-web 依赖即可. 一.单文件上传 1,代码编写 (1)首先在 stati ...
- 设计模式(五)——原型模式(加Spring框架源码分析)
原型模式 1 克隆羊问题 现在有一只羊 tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和 tom 羊 属性完全相同的 10 只羊. 2 传统方式解决克隆羊问题 1) 思路分析(图 ...
- HBase原理 – 分布式系统中snapshot是怎么玩的?(转载)
snapshot(快照)基础原理 snapshot是很多存储系统和数据库系统都支持的功能.一个snapshot是一个全部文件系统.或者某个目录在某一时刻的镜像.实现数据文件镜像最简单粗暴的方式是加锁拷 ...
- Codeforces Round #656 (Div. 3) B. Restore the Permutation by Merger
题目链接:https://codeforces.com/contest/1385/problem/B 题意 有两个大小为 $n$ 的相同的排列,每次从二者或二者之一的首部取元素排入新的数组,给出这个大 ...
- AcWing 239.奇偶游戏 (带权并查集/种类并查集)
题意:你和朋友玩游戏,有个一\(01\)序列,你每次给出一个区间,朋友会回答这个区间中的\(1\)的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题 ...
- Codeforces Educational Rounds 85 A~C
A:Level Statistics 题意:统计n个游戏数据,p代表游玩次数,c代表通关次数,每次游玩都不一定通关,求这些数据是否合法 题解:1.游玩次数不能小于通关次数 2.游玩次数和通关次数必 ...