首先连接上linux服务器。
搜索镜像:
我们安装那些带有management标志的版本,这个表示是有携带web的管理界面的哦。
记得使用镜像加速哦
docker pull registry.docker-cn.com/library/rabbitmq:3-management
5672端口是客户端和rabbitmq进行通信的端口。
15672是访问web管理界面的端口。
账号是:guest,密码也是:guest。
菜单:概览、连接、信道、交换器、消息队列、管理控制台
结合前面的内容,测试一下rabbitmq的消息路由机制。
上面三个交换器,绑定了四个队列。
队列的名字,都是最终,绑定的路由键的名字。routing-key的名字。
durable的意思是持久化的意思。
持久化的意思就是说,下一次rabbitmq如果重启的话,里面的消息还是存在的。
如果没有持久化的话,rabbitmq如果重启的话,里面的消息,就不存在了。
点击添加之后,就添加成功了。
最终完成三个交换器的创建工作。
用这种方式,完成添加四个队列。
完成对四个队列的绑定:
同样的操作,我们给另外的两个交换器,也绑定上这些queue。
号代表,匹配0个单词,或者匹配多个单词。
*号代表,匹配1个单词。
到现在为止,交换器和队列的绑定关系,就已经完成了。
接下来,我们给每个交换器都发送点消息,来看一下到底哪一个队列能够收到这些消息。
direct就是,路由键是什么,就会发给什么队列。
不管你的路由键,是什么玩意,你发送消息了之后,所有的队列,都能够接收到的。
测试一下:
发布完成后,一看队列当中,所有的队列,都新增了一条消息的哦:
如果我们是这么发送消息,会发送到哪里呢?
应该发送到,上面的三个队列:atguigu.news,atguigu.emps,atguigu。
还符合*.news的规则,比如说atguigu.news,gulixueyuan.news的规则。
所以说,上面的队列,都能接收到这些消息。
查看一下,消息应该是都到达了:
如果我们按照下面的规则来进行发送呢:
我们可以点进去,获取一下消息:
选择这个ACK mode的意思就是:告诉它我们获取来了,让消息队列把这个消息给删除掉。
第二次获取的时候,第一次的消息,就已经被删除掉了。这就是调整ACK mode的效果哦。
第三次获取,是下面的信息:
为了测试方便,可以引入web模块:
spring-boot-starter-amqp的内容是什么呢?
在springboot当中,我们只需要引入相应的场景依赖,一切都是自动配置的哦。
我们一般,都可以,先分析一下,自动配置原理。
这个,其实在整合,其他内容的时候,也是一样的道理,也是一样的过程哦。
我们通过ctrl+n打开搜索:RabbitAutoConfiguration。
我们要看看,自动配置类,给我们的IOC容器当中,到底配置了什么东西?
如上图,是给我们配置了一个CachingConnectionFactory。从这里,可以获取rabbitmq的连接。
连接信息包含:主机地址,用户名,密码,vhost等等。
这些连接信息,都是从config得到的。
这个config,其实就是RabbitProperties。
这个,就是和我们的配置文件当中内容,绑定的配置文件。
这个里面封装了RabbitMQ的所有配置。
根据我们的RabbitProperties,我们,就可以在application.properties当中进行相关的配置了。
我们接着,看自动配置类,我们发现了,这个自动配置类,给容器当中,注入了一个RabbitTemplate这个东西。
这个,就是给RabbitMQ发送和接收消息的。
这个,就类似,大家以前,使用的JdbcTemplate、RedisTemplate等等。
我们还可以看到,这个自动配置类,还给容器当中,注入了AmqpAdmin这个组件。
这个AmqpAdmin是RabbitMQ的系统管理功能组件。
它可以帮我们创建、声明一个队列queue、声明一个exchange。
在test当中,自动装配我们的RabbitTemplate。
在这个单播的测试中,我们使用send方法,就可以了,但是,是需要我们自己构造一个message的。
我们先查一下,研究一下,这个message。
点进去,看看吧。
这里表示的是,我们需要把我们的message的消息体,要序列化成为一个字节数组。
我们message的头信息,消息头,要带在一个MessageProperties当中。
我们经常使用的方法,是叫做rabbitTemplate.convertAndSend()这个方法的。
然后,我们可以运行上面的contextLoads,来发送消息。
我们进入到消息队列,发现atguigu.news这个队列,已经接收到了这个消息:
但是接收到的消息,是这个样子的:
这是因为,我们在进行ConvertandSend的时候,要进行序列化,而序列化的方式,是采用java的序列化的方式,来转换对象的。
这里,已经证明了,对象被默认序列化之后作为消息发送了出去。
运行程序之后,我们得到了,下面的结果:
如果,我们接收到了这些数据,我们看到,消息队列当中,这些数据,就已经没有了:
我们进入到RabbitTemplate当中,研究一下:
可以看到,在RabbitTemplate当中,有一个messageConverter的东西,这个东西,默认使用的是SimpleMessageConverter,就是简单消息转换器。
上面,展示了,简单消息转换器的,序列化的,逻辑。
我们可以给RabbitTemplate换一个消息转换器,也就是MessageConverter。
我们如何自定义RabbitMQ配置,来修改MessageConverter呢?
我们可以阅读一下自动配置类的源码的:
在这里面,说的是,如果我们又自己配置的rabbitTemplate的messageConverter,也是会给我们设置进来的哦。
所以,我们只需要编写一个配置类,然后注入一个相应的MessageConverter,就可以了呢。
运行完程序,然后去队列当中,看是否有发送的消息的时候,是这样的:
证明,是,我们配置的messageConvert已经生效的。
编写一个自定义的对象:
消息发送出去了:
测试,反序列化获取:
实际开发过程中,我们需要一些监听场景。
这样,就可以实现,监听消息队列当中的内容了。
主程序的控制台,已经收到消息了:
如果,我们在监听和接收消息的,时候,我们也想要获取消息头,我们可以像下面这样写:
我们可以使用AmqpAdmin来创建和删除exchange和queue。
我们可以看到,这是,我们的自动配置类当中,给我们注入的这样的一个组件。
我们可以在创建exchange的时候传入一些属性哦。
这里,就是表示,创建成功。
这个Queue就是一个类,不是接口了。
这里,是创建一个队列:
绑定规则,就是将exchange和queue来绑定起来的。