大家好,我是润森。期末已挂,又有时间写笔记。
MQ
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。
RabbitMQ
RabbitMQ是一个遵循AMQP协议的消息中间件,它从生产者接受消息并传递给消费者,在这和过程中,根据路由规则就行路由、缓存和持久化。
docker 搭建RabbitMQ
docker pull rabbitmq:management (镜像配有控制台)# 创建容器docker run -d -p 5672:5672 -p 15672;15672 --name myrabbitmq rabbitmq:management
启动容器后,可以浏览器中访问http://localhost:15672
来查看控制台信息。
RabbitMQ默认的用户名:guest,密码:guest
RabbitMQ概念和理解
RabbitMQ有几个重要的概念:虚拟主机,交换机,队列和绑定
- 虚拟主机:一个虚拟主机持有一组交换机、队列和绑定,我们可以从虚拟主机层面的颗粒度进行权限控制
- 交换机:Exchange用于转发消息,它并不存储消息,如果没有Queue队列绑定到Exchange,它会直接丢弃掉生产者发来的数据。
- 交换机还有个关联的重要概念:路由键,消息转发到哪个队列根据路由键决定
- 绑定:就是绑定交换机和队列,它是多对多的关系,也就是说多个交换机可以绑同一个队列,也可以一个交换机绑多个队列
交换机有四种类型的模式Direct, topic, Headers and Fanout
这是队列和交换器的关系图
这就是它们区别
fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中。
direct:把消息投递到那些binding key与routing key完全匹配的队列中。
topic:将消息路由到binding key与routing key模式匹配的队列中。
系统架构
spring整合Rabbitmq
pom.xml引进spring-boot-starter-amqp
org.springframework.boot spring-boot-starter-amqp
application.properties配置文件
spring.rabbitmq.host=ipspring.rabbitmq.username=guestspring.rabbitmq.password=guest
DemoRabbitmqApplicationTests
测试类
使用的是单播
原则
@SpringBootTestclass DemoRabbitmqApplicationTests { @Autowired RabbitTemplate rabbitTemplate; @Autowired AmqpAdmin amqpAdmin; @Test void contextLoads() { //Message需要自己构造一个;定义消息体内容和消息头 //rabbitTemplate.send(exchage,routeKey,message); //object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq; //rabbitTemplate.convertAndSend(exchage,routeKey,object); Map map = new HashMap<>(); map.put("msg", "这是第一个消息"); map.put("data", Arrays.asList("helloworld", 123, true)); System.out.println(map.toString()); rabbitTemplate.convertAndSend("exchange.direct", "atguigu.news", map); System.out.println("消息发送出去"); } //接受数据,如何将数据自动的转为json发送出去 @Test void receive() { Object o = rabbitTemplate.receiveAndConvert("atguigu.news"); System.out.println(o.getClass()); System.out.println(o); }}
在atguigu.news
队列中查看对应的数据
如何将网页端的输出atguigu.news
队列数据转化成json
序列化,就要自定义MyAMQPConfig
在config文件夹中,新建MyAMQPConfig
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;import org.springframework.amqp.support.converter.MessageConverter;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @author: 毛利 */@Configurationpublic class MyAMQPConfig { @Bean public MessageConverter messageConverter() { return new Jackson2JsonMessageConverter(); }}
将messageConverter
换为Jackson2JsonMessageConverter
,再测试运行
spring传递Bean对象
传递Book
对象到Rabbitmq
新建bean
文件Book
对象,一个bookName
和一个author
类变量
ALT+INS
补充tostring
,Constructor
有无参构造器,Getter和Setter
package com.example.demorabbitmq.Bean;/** * @author: 毛利 */public class Book { private String bookName; private String author; public Book() { } public Book(String bookName, String author) { this.bookName = bookName; this.author = author; } public String getBookName() { return bookName; } @Override public String toString() { return "Book{" + "bookName='" + bookName + '\'' + ", author='" + author + '\'' + '}'; } public void setBookName(String bookName) { this.bookName = bookName; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; }}
DemoRabbitmqApplicationTests
测试类 rabbitTemplate.convertAndSend
传递Book("西游记","吴承恩"))
@Testvoid contextLoads() { //Message需要自己构造一个;定义消息体内容和消息头 //rabbitTemplate.send(exchage,routeKey,message); //object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq; //rabbitTemplate.convertAndSend(exchage,routeKey,object); Map map = new HashMap<>(); map.put("msg", "这是第一个消息"); map.put("data", Arrays.asList("helloworld", 123, true));// System.out.println(map.toString()); rabbitTemplate.convertAndSend("exchange.direct", "atguigu.news", new Book("西游记","吴承恩")); System.out.println("消息发送出去");}
测试运行
补充广播fanout
Exchange之fanout交换器(广播)
@Test public void sendMsg() { rabbitTemplate.convertAndSend("exchange.fanout", "", new Book("红楼梦", "曹雪芹")); }
总结
RabbitMQ 本文使用Docker搭建RabbitMQ,使用Springboot传递消息到RabbitMQ,通过自定义RabbitMQ,将消息改为json序列。希望以上对你学习有用
再自我介绍一下吧。我叫润森,是一个的学习者。
---------- END ----------
重磅!全网vip电影免费看功能已上线!
主页搜索电影名字即可观看vip免费电影( 搜索功能目前正在备案,用的是网上的免费链接,会存在不适的广告,建议使用电脑使用搜索功能或者使用小程序进行观影),或点击下方菜单栏哈克精选,即可打开小程序进行观影!推荐阅读
• 内部泄露版!大厂的最新薪资和职级一览
• 聊聊非科班学IT
• 自用神级超级牛逼 15款 IntelliJ IDEA插件
• springboot中的cache(三)
如有收获,点个在看,诚挚感谢 下次见(。・ω・。)