在上面的例子中,我们直接发送字符串到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
以上这些概念,以及前面篇文章中遗留下来的概念,我们将在下一篇文章中详细介绍.
个人公众号<橙耘自留地>日前已经开通,后续博主发布的文章都会一并更新到公众号,如有需要,自行查阅.
关于橙耘自留地,是我个人聚焦互联网技术栈学习分享的一个平台,创立之初是因为目前业内各种技术课程资料层次不齐,褒贬不一,有时候一门课花费高价买入,其实内含草包,有时偶尔低价得之,却又大有干货.因此我会根据大家的意见和评价,选择不同的技术栈去学习,一为提升我自己的技术,二为大家梳理出质量比较好的课程,以作参考.同时,相关的学习心得也会一并更新到博客和公众号.