1. 什么是MQ
MQ
(Message Quene) : 即 消息队列
、 消息中间件
,通过典型的 生产者
和消费者
模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。它通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
2.RabbitMQ
官网下载地址
: https://www.rabbitmq.com/download.html
2.1 web管理界面介绍
-
connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况
-
channels:通道,建立连接后,会形成通道,消息的投递获取依赖通道。
-
Exchanges:交换机,用来实现消息的路由
-
Queues:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。
2.2 用户添加
上面的Tags选项,可以选择用户权限,权限选项如下:
-
超级管理员(administrator)
可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
-
监控者(monitoring)
可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
-
策略制定者(policymaker)
可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
-
普通管理者(management)
仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
-
其他
无法登陆管理控制台,通常就是普通的生产者和消费者。
2.3 创建虚拟主机
- 虚拟主机:为了让各个用户可以互不干扰的工作,RabbitMQ添加了虚拟主机(Virtual Hosts)的概念。其实就是一个独立的访问路径,不同用户使用不同路径,各自有自己的队列、交换机,互相不会影响。
2.4 用户与虚拟主机绑定
① 新建虚拟主机:
② 新建用户
③ 绑定虚拟主机
3.RabbitMQ的消息模型
3.1 AMQP协议模型
3.2 RabbitMQ支持的消息模型
3.2.1 引入依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.7.2</version>
</dependency>
3.2.2 “Hello World”模式
在上图的模型中,有以下概念:
- P:生产者,消息生产者
- C:消费者,消息消费者
- queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。
1)消息生产者代码
public class Provider
{
//生产消息
@Test
public void testSendMessage() throws IOException, TimeoutException
{
//创建连接mq的连接工厂对象
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置连接rabbitmq主机
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
//设置连接哪个虚拟主机
connectionFactory.setVirtualHost("lucky");
//设置访问虚拟主机的用户名和密码
connectionFactory.setUsername("luckyUser");
connectionFactory.setPassword("123");
//获取连接对象
Connection connection = connectionFactory.newConnection();
//获取连接中通道
Channel channel = connection.createChannel();
//通道绑定对应消息队列
//参数1:队列名称 如果队列中不存在会自动创建
//参数2:用来定义队列特性是否持久化 true持久化队列 false 不持久化 而非队列中消息
//参数3:exclusive 是否独占队列 true 独占队列
//参数4:autoDelete 是否在消费完成后自动删除队列 true 自动删除
//参数5: 附加参数
channel.queueDeclare("hello",true,false,false,null);
//发布消息
//参数1:交换机名称 参数2:队列名称 参数3:传递消息额外设置 MessageProperties.PERSISTENT_TEXT_PLAIN 消息也持久化 (需要保证生产者与消费者参数一致) 参数4:消息具体内容
channel.basicPublish("","hello", MessageProperties.PERSISTENT_TEXT_PLAIN,"hello rabbitmq".getBytes());
channel.close();
connection.close();
}
}