RabbitMQ从docker下载到代码实现生成消息、获取消息
RabbitMQ是一个消息服务中间件
一,RabbitMQ消息队列模型:
1,理解一下为什么生产者和队列中间加一个交换机而队列和消费者中间不需要交换机
如果没有交换机,生产者生产一条消息需要发送给多个队列,生产者做了重复工作而且随着队列越来越多,生产者发送压力也会越来越大,引入交换机后,重复工作交给交换机,生产者只需要发送一条消息给交换机即可,生产者不用同时担任生产消息和重复发送数据的角色,所以引入交换机是有必要的。
消费者和队列之间为什么没有交换机?消费者只有在需要消息的时候才会从队列里取消息,而不是队列里一有消息就肯定会直接获取,加入交换机首先需要向交换机询问消息是否存在,交换机再去队列里逐个查询,反而繁琐,直接监听到具体队列,有消息就获取,是比较简单的方法。
2,交换机一共有三种:
1)Direct:点对点传送消息
2)fanout:广播传送消息
3)topic:发布/订阅传送消息
3,交换机和队列的绑定关系
1)队列绑定到Direct交换机,将一个路由键绑定到Direct交换机,生产者发送消息携带指定的路由键,Direct交换机根据路由键将消息转发给制定队列;
2)队列绑定到fanout交换机,路由键已经不再生效,一旦交换机传来消息,只要是和fanout广播交换机绑定的队列都会受到这条消息;
3)队列绑定到topic交换机,路由键一般由字母+符号组成,符号表示的是占位符,*或#,*代表任意一个单词(注意必须是有且只有一个单词),#代表0个或多个单词,传过来的路由键会匹配固定字母并且识别后续单词内容完成消息传递
T.*: T.aa、T.bb ······
T.#: T、T.aa、T.aa.bb ······
4,SpringBoot整合RabbitMQ
1)IDEA创建SpringBoot工程并引入RabbitMQ场景:
2)引入的RabbitMQ场景做了大量的默认配置,RabbitAutoConfiguration类中进行了自动配置,包括自动创建连接工厂
CachingConnectFactory完成对RabbitMQ的连接,该方法依赖RrabbitProperties文件,这是一个可以在application.properties文件里完成配置的配置文件
因此我们只需要在appilication.porperties文件中完成几项配置即可完成对RabbitMQ服务中间件的连接:
spring.rabbit.host:【rabitmq所在主机ip地址】
spring.rabbit.username:guest
spring.rabbit.password:guest
RabbitAutoConfiguration类也为用户提供了一个操作中间件的接口:RabbitTemplate
· 发送消息(send message):send(exchange,routingKey,message)与convertAndSend(exchange,routingKey,object)
send(exchange,routingKey,message)方法需要自定义封装Message消息,包括消息头和消息体;
convertAndSend(exchange,routingKey,object)方法的Object是发送消息本体,方法会将object对象序列化然后进行传送,但是RabbitMQ服务中间件收到的消息是经过序列化的长串无规则英文字符传,稍后给出自定义MessageConvert转json字符串进行传递的方法;
· 接收消息(recerive message):receive(queue name)与receiveAndConvert(queue name)
receive(queue name)方法返回Message对象,依然需要解析消息头消息体获取消息正文;
receiveAndConvert(queue name)方法返回Object对象,可强转类型获取消息内容。
3)自定义MessageConvert将消息以json方式传递而非序列化
RabbitMQ会自动装配自定义的MessageConvert完成消息转换,返回一个Jackson2JsonMessageConverter实例对象即可。