Java教程

雷丰阳springboot之消息之rabbitmq整合

本文主要是介绍雷丰阳springboot之消息之rabbitmq整合,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 下载镜像
  • 启动运行镜像
  • 访问管理界面
  • 测试方法
  • 创建交换器
  • 添加消息队列
  • 队列和交换器绑定

image-20210504113019538

首先连接上linux服务器。

搜索镜像:

image-20210504113059887

image-20210504113132783

我们安装那些带有management标志的版本,这个表示是有携带web的管理界面的哦。

下载镜像

记得使用镜像加速哦

docker pull registry.docker-cn.com/library/rabbitmq:3-management

image-20210504113338557

启动运行镜像

image-20210504113446930

5672端口是客户端和rabbitmq进行通信的端口。

15672是访问web管理界面的端口。

访问管理界面

image-20210504113634508

账号是:guest,密码也是:guest。

image-20210504113713458

菜单:概览、连接、信道、交换器、消息队列、管理控制台

image-20210504113807013

结合前面的内容,测试一下rabbitmq的消息路由机制。

测试方法

image-20210504113933520

上面三个交换器,绑定了四个队列。

队列的名字,都是最终,绑定的路由键的名字。routing-key的名字。

创建交换器

image-20210504114246902

durable的意思是持久化的意思。

持久化的意思就是说,下一次rabbitmq如果重启的话,里面的消息还是存在的。

如果没有持久化的话,rabbitmq如果重启的话,里面的消息,就不存在了。

点击添加之后,就添加成功了。

image-20210504114315980

最终完成三个交换器的创建工作。

image-20210504114410162

添加消息队列

image-20210504114451678

用这种方式,完成添加四个队列。

image-20210504114555390

队列和交换器绑定

image-20210504114651731

完成对四个队列的绑定:

image-20210504114853161

同样的操作,我们给另外的两个交换器,也绑定上这些queue。

image-20210504115119901

号代表,匹配0个单词,或者匹配多个单词。

*号代表,匹配1个单词。

到现在为止,交换器和队列的绑定关系,就已经完成了。

发送消息测试

接下来,我们给每个交换器都发送点消息,来看一下到底哪一个队列能够收到这些消息。

测试direct

image-20210504115428625

image-20210504115520501

image-20210504115611937

direct就是,路由键是什么,就会发给什么队列。

测试fanout

不管你的路由键,是什么玩意,你发送消息了之后,所有的队列,都能够接收到的。

测试一下:

image-20210504115735371

发布完成后,一看队列当中,所有的队列,都新增了一条消息的哦:

image-20210504115811471

image-20210504115837878

测试topic

image-20210504120234068

如果我们是这么发送消息,会发送到哪里呢?

image-20210504120301863

应该发送到,上面的三个队列:atguigu.news,atguigu.emps,atguigu。

还符合*.news的规则,比如说atguigu.news,gulixueyuan.news的规则。

所以说,上面的队列,都能接收到这些消息。

查看一下,消息应该是都到达了:

image-20210504120527715

如果我们按照下面的规则来进行发送呢:

image-20210504120623572

image-20210504120902860

我们可以点进去,获取一下消息:

image-20210504121036252

选择这个ACK mode的意思就是:告诉它我们获取来了,让消息队列把这个消息给删除掉。

image-20210504121153754

image-20210504121220890

第二次获取的时候,第一次的消息,就已经被删除掉了。这就是调整ACK mode的效果哦。

第三次获取,是下面的信息:

image-20210504121314084


整合测试rabbitmq

image-20210504133002141

创建项目

image-20210504133045611

image-20210504133110131

为了测试方便,可以引入web模块:

image-20210504133146282

pom文件

spring-boot-starter-amqp的内容是什么呢?

image-20210504133251098

配置使用

在springboot当中,我们只需要引入相应的场景依赖,一切都是自动配置的哦。

我们一般,都可以,先分析一下,自动配置原理。

自动配置原理

这个,其实在整合,其他内容的时候,也是一样的道理,也是一样的过程哦。

第一步:找自动配置类

我们通过ctrl+n打开搜索:RabbitAutoConfiguration。

image-20210504133543402

image-20210504133601282

第二步:研究自动配置类

我们要看看,自动配置类,给我们的IOC容器当中,到底配置了什么东西?

CachingConnectionFactory

image-20210504133845770

如上图,是给我们配置了一个CachingConnectionFactory。从这里,可以获取rabbitmq的连接。

连接信息包含:主机地址,用户名,密码,vhost等等。

这些连接信息,都是从config得到的。

这个config,其实就是RabbitProperties。

RabbitProperties

这个,就是和我们的配置文件当中内容,绑定的配置文件。

image-20210504134001780

这个里面封装了RabbitMQ的所有配置。

application.properties

根据我们的RabbitProperties,我们,就可以在application.properties当中进行相关的配置了。

image-20210504134457194

image-20210504134433426

RabbitTemplate

我们接着,看自动配置类,我们发现了,这个自动配置类,给容器当中,注入了一个RabbitTemplate这个东西。

image-20210504134727460

这个,就是给RabbitMQ发送和接收消息的。

这个,就类似,大家以前,使用的JdbcTemplate、RedisTemplate等等。

AmqpAdmin

我们还可以看到,这个自动配置类,还给容器当中,注入了AmqpAdmin这个组件。

image-20210504134924155

这个AmqpAdmin是RabbitMQ的系统管理功能组件。

它可以帮我们创建、声明一个队列queue、声明一个exchange。

自动配置类研究总结

image-20210504135029978

开始测试

在test当中,自动装配我们的RabbitTemplate。

单播(点对点)

image-20210504135439256

在这个单播的测试中,我们使用send方法,就可以了,但是,是需要我们自己构造一个message的。

message消息

我们先查一下,研究一下,这个message。

image-20210504135255821

点进去,看看吧。

image-20210504135329296

这里表示的是,我们需要把我们的message的消息体,要序列化成为一个字节数组。

我们message的头信息,消息头,要带在一个MessageProperties当中。

单播(点对点)

我们经常使用的方法,是叫做rabbitTemplate.convertAndSend()这个方法的。

image-20210504135918788

然后,我们可以运行上面的contextLoads,来发送消息。

我们进入到消息队列,发现atguigu.news这个队列,已经接收到了这个消息:

image-20210504140043865

但是接收到的消息,是这个样子的:

image-20210504140136202

这是因为,我们在进行ConvertandSend的时候,要进行序列化,而序列化的方式,是采用java的序列化的方式,来转换对象的。

这里,已经证明了,对象被默认序列化之后作为消息发送了出去。

接收消息

image-20210504140450044

运行程序之后,我们得到了,下面的结果:

image-20210504140526679

如果,我们接收到了这些数据,我们看到,消息队列当中,这些数据,就已经没有了:

image-20210504140615623

如何将对象数据自动转为JSON发送出去呢?

我们进入到RabbitTemplate当中,研究一下:

image-20210504140810364

可以看到,在RabbitTemplate当中,有一个messageConverter的东西,这个东西,默认使用的是SimpleMessageConverter,就是简单消息转换器。

SimpleMessageConverter

image-20210504141006377

上面,展示了,简单消息转换器的,序列化的,逻辑。

MessageConverter

我们可以给RabbitTemplate换一个消息转换器,也就是MessageConverter。

image-20210504141116837

image-20210504141600997

自定义RabbitMQ配置

我们如何自定义RabbitMQ配置,来修改MessageConverter呢?

我们可以阅读一下自动配置类的源码的:

image-20210504141730968

在这里面,说的是,如果我们又自己配置的rabbitTemplate的messageConverter,也是会给我们设置进来的哦。

所以,我们只需要编写一个配置类,然后注入一个相应的MessageConverter,就可以了呢。

image-20210504141223456

image-20210504141855512

再次测试消息发送和接收哦

运行完程序,然后去队列当中,看是否有发送的消息的时候,是这样的:

image-20210504142003440

证明,是,我们配置的messageConvert已经生效的。

发送自定义对象

编写一个自定义的对象:

image-20210504142210378

image-20210504142307952

消息发送出去了:

image-20210504142344255

测试,反序列化获取:

image-20210504142422309

广播测试

image-20210504142544430

image-20210504142616850

监听场景

实际开发过程中,我们需要一些监听场景。

第一步:开启基于注解的rabbitmq

image-20210504142927528

第二步:写一个service注解监听

image-20210504143023335

这样,就可以实现,监听消息队列当中的内容了。

image-20210504143156193

主程序的控制台,已经收到消息了:

image-20210504143234623

如果,我们在监听和接收消息的,时候,我们也想要获取消息头,我们可以像下面这样写:

image-20210504143447840


程序创建exchange和queue

我们可以使用AmqpAdmin来创建和删除exchange和queue。

image-20210504143645833

我们可以看到,这是,我们的自动配置类当中,给我们注入的这样的一个组件。

创建exchange

image-20210504143759720

image-20210504143838062

image-20210504143907191

我们可以在创建exchange的时候传入一些属性哦。

image-20210504143957258

image-20210504144015880

这里,就是表示,创建成功。

创建queue

image-20210504144104943

这个Queue就是一个类,不是接口了。

image-20210504144145377

这里,是创建一个队列:

image-20210504144222349

image-20210504144246047

创建binding

绑定规则,就是将exchange和queue来绑定起来的。

image-20210504144342568

image-20210504144406360

image-20210504144537197

image-20210504144603357

这篇关于雷丰阳springboot之消息之rabbitmq整合的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!