1、队列: 点对点的通信(point - to - point): 消息发送者发送消息,消息代理将其放入到一个队列中,消息接收者从队列中获取消息内容,消息读取后被移除出队列。
2、主题: 发布publish/订阅subscribe 消息通信: 发布者发送消息到主题,多个接收者(订阅者)订阅这个主题,那么就会在消息到达时同时收到消息
(三) RabbitMQ的核心概念
1、Message(消息): 不具名,由消息头和消息体租出,消息体是不透明的。消息头是由一系列的可选属性组成如,routing-key路由键,priority-相对其他消息的优先权,delivery-mode-指出该消息是否需要永久存储等。
2、Publicsher(消息的生产者): 是向交换器发布消息的客户端应用程序。
3、Exchange(交换器): 用来接受消息并且消息路由给服务器中的队列,有四种类型,即决定消息发布到那个队列,具体有以下的类型:
(1)、Direct:消息中的路由键(routingkey),如果和Binding中的binding key 一致,那么就将消息发到对应的队列中。
(2)、Fanout类型: 即广播模式,每个发送到fanout类型的交换器消息,交换器会将消息发送到它绑定的所有队列中,它转发消息是最快的。
(3)、Topic:主题,可以设置模糊匹配,会识别"#“和”*"号,#表示匹配0个或者多个单词,*匹配一个单词,单词之间使用:逗号隔开。
(4)、headers:实现发布订阅模型(基本不使用了)。
4、Queue(消息队列): 消息的容器,一个消息可以放在一个或者多个队列中。
5、Binding(绑定): 用于消息队列和交换器之间的关联,一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,交换器跟队列的绑定可以是多对多的关系
6、Connection(网络连接): 如一个Tcp连接。
7、Channel(信道): 多路复用连接中的一条独立的双向数据流通道,信道是建立在真实的TCP连接内的虚拟通道,AMQP命令都是通过信道发出去的,不管是发布消息,订阅队列,还是接收消息,都是通过信道完成,因为对于操作系统来说创建和销毁一个TCP连接都是很昂贵的开销,所以使用信道以实现复用一条TCP连接。
8、Consumer(消费者): 接受和消费消息。
9、Virtaul Hos(虚拟主机): 即小型的RabbitMQ服务器,它表示一批交换器,消息队列和相关对象,连接时必须指定,默认是:/(以路径区分)。
10、Broker: 消息队列服务器实体。
五: Spring如何整合rabbitMQ?
(一) 添加依赖
org.springframework.boot
spring-boot-starter-amqp
2.2.1.RELEASE
(二) 设置配置信息
spring:
application:
name: RabbitMQ-Test # 应用名称
rabbitmq:
host: localhost #rabbitServer的地址
port: 5672 # 端口
username: guest # 用户名称
password: guest # 连接密码
virtual-host: /
server:
port: 9090
(三) 启动类添加EnableRabbit注解
@SpringBootApplication
@EnableRabbit
public class RabbitMqTestApplication {
public static void main(String [] args){
SpringApplication.run(RabbitMqTestApplication.class,args);
}
}
六: 如何通过代码操作RabbitMQ?
注: 因为本篇文章到此处已经是比较长了,考虑到大家的阅读时间,所以RabbitMQ的操作的具体参数会另起一片文章做详细的讲解,需要了解操作参数的详细含义的,可以点击文章末尾的连接跳转,谢谢理解。
(一) Spring提供操作RabbitMQ的工具类
1、RabbitTemplate: 是Spring集成RabbitMQ而提供的一个工具类,跟JdbcTemplate一样,可以通过它进行消息的发送和接收。
2、RabbitAdmin : 主要用于管理交换机和队列的信息。
(二) 测试的公共执行代码
// 测试前加载RabbitAdmin
private static AmqpAdmin amqpAdmin;
private static ConnectionFactory connectionFactory;
@BeforeClass
public static void loadNeedBean(){
com.rabbitmq.client.ConnectionFactory connFactory = new com.rabbitmq.client.ConnectionFactory();
connFactory.setHost(“47.91.198.211”);
connFactory.setPort(5672);
connFactory.setUsername(“guest”);
connFactory.setPassword(“guest”);
connFactory.setVirtualHost(“/”);
connectionFactory = new CachingConnectionFactory(connFactory);
// RabbitAdmin 主要用于管理交换机和队列的信息
amqpAdmin = new RabbitAdmin(connectionFactory);
}
(三) 操作交换机(Exchange)
// 交换机操作
@Test
public void rabbitExchangeTest() throws Exception{
// 创建交换机
// 参数分别是: 交换机名称,是否持久化,是否自动删除
Exchange exchange = new DirectExchange(“direct_test”,true,false);
amqpAdmin.declareExchange(exchange);
// 删除交换机
amqpAdmin.deleteExchange(“direct_test”);
}
(四) 操作队列(Queue)
// 操作队列
@Test
public void rabbitExchangeAndQueueTest() throws Exception{
// 创建队列
Queue queue = new Queue(“queue_test111”);
amqpAdmin.declareQueue(queue);
// 删除队列
amqpAdmin.deleteQueue(“queue_test111”);
}
(五) 交换机和队列的绑定
// 队列和交换机操作
@Test
public void rabbitQueueTest(){
// 创建交换机
Exchange exchange = new DirectExchange(“direct_test2”,true,false);
amqpAdmin.declareExchange(exchange);
// 创建队列
Queue queue = new Queue(“queue_test”,true);
amqpAdmin.declareQueue(queue);
// 绑定交换机交换机
//Binding binding = new Binding(“direct_test2”, Binding.DestinationType.EXCHANGE,“direct_test2”,“rount-key”,null);
// 队列绑定到交换机
Binding binding = new Binding(“queue_test”, Binding.DestinationType.QUEUE,“direct_test2”,“rount-key”,null);
amqpAdmin.declareBinding(binding);
}
(六) 消息生产者发送消息到消息队列中
@Test
public void messageProductTest(){
// 消息操作模板
RabbitTemplate rest = new RabbitTemplate(connectionFactory);
MessageProperties messageProperties = new MessageProperties();
messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
// 发送消息方式一
String msg = “hello world”;
Message message = new Message(msg.getBytes(),messageProperties);
// 发送消息方式二
HashMap map = new HashMap();
map.put(“key”,“value”);
rest.convertAndSend(“direct_test2”,“rount-key”,map);
}
(七) 消息消费者从队列中消费(手动执行的方式)
// 消息的消费者
@Test
public void messageConsumerTest() throws Exception{
RabbitTemplate rest = new RabbitTemplate(connectionFactory);
// 从名为queue_test的队列中获取消息
Message queue_test = rest.receive(“queue_test”);
System.out.println(new String(queue_test.getBody(),“UTF-8”));
}
最后
我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。
essage queue_test = rest.receive(“queue_test”);
System.out.println(new String(queue_test.getBody(),“UTF-8”));
}
最后
我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
[外链图片转存中…(img-wEDjtAB4-1714057288193)]
还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。
[外链图片转存中…(img-8kecq3tK-1714057288194)]
本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录