写在前面

如果对你有帮助,请给点个关注和点个赞哦,嘿嘿嘿
MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。而RabbitMQ是实现了高级消息队列协议的开源消息代理软件。RabbitMQ服务器是用Erlang语言编写的,而聚类和故障转移是构建在开放电信平台框架上的。

部署RabbitMQ

首先在用SpringBoot集成RabbitMQ之前呢,我们当然需要先部署一个RabbitMQ啦,你可以选择自己电脑安装,但是我还是比较推荐使用Docker进行部署的,比较方便,Docker部署RabbitMQ比较方便,这里我教一下如何使用Docker部署RabbitMQ,我使用的操作系统是Ubuntu19,首先把RabbitMQ的镜像pull下来,注意pull镜像的时候要获取management版本的,不要获取last版本的,management版本的才带有管理界面,比如

1
docker pull rabbitmq:3.8.2-management

等待pull下来,pull下来之后,我们就可以直接运行了(这里只是简单的安装了一个单点Rabbitmq,如果要部署集群,当然没有这么简单啦,可以看我另一篇博文),运行的命令如下:

1
docker run -d  -p 15672:15672  -p  5672:5672  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq rabbitmq:3.8.2-management

该镜像拥有一个基于 web 的控制台和 Http API。Http API 可以在地址看到如何使用:http://localhost:15672/api/,这里说明一下指令选项

  • 15672 :表示 RabbitMQ 控制台端口号,可以在浏览器中通过控制台来执行 RabbitMQ 的相关操作。
  • 5672 : 表示 RabbitMQ 所监听的 TCP 端口号,应用程序可通过该端口与 RabbitMQ 建立 TCP 连接,并完成后续的异步消息通信
  • RABBITMQDEFAULTUSER:用于设置登陆控制台的用户名,这里我设置 admin
  • RABBITMQDEFAULTPASS:用于设置登陆控制台的密码,这里我设置 admin

容器启动成功后,可以在浏览器输入地址:http://ip地址:15672/ 访问控制台
在这里插入图片描述
在这里插入图片描述
这里简单描述下上图中控制台的列表的作用:

  • Overview :用于查看 RabbitMQ 的一些基本信息(消息队列、消息发送速率、节点、端口和上下文信息等)
  • Connections:用于查看 RabbitMQ 客户端的连接信息
  • Channels:用户查看 RabbitMQ 的通道信息
  • Exchange:用于查看 RabbitMQ 交换机
  • Queues:用于查看 RabbitMQ 的队列
  • Admin:用于管理用户,可增加用户

SpringBoot整合RabbitMQ

首先使用Idea创建一个只包含web模块的项目,然后引入rabbitmq的依赖,依赖如下:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

然后我们在application.properties主配置文件中进行如下配置

1
2
3
4
spring.rabbitmq.host=xxxxxxip地址
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin

然后接下来我们写一个针对RabbitMQ的配置文件(用来管理消息队列),以及一个Sender和一个Receiver,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class HelloSender {
@Autowired
private AmqpTemplate rabbitTemplate;

public void send(){
String context = "hello " + new Date();
System.out.println("Sender : " + context);
this.rabbitTemplate.convertAndSend("hello", context);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "hello")
public class HelloReceiver {

@RabbitHandler
public void process(String hello){
System.out.println("Receiver : " + hello);
}
}
1
2
3
4
5
6
7
8
9
10
11
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {
@Bean
public Queue helloQueue(){
return new Queue("hello");
}
}

测试及结果

这里测试发送的消息直接是 String 类型的,你也可以测试下 Bean 类,这需要注意需要序列化。

1
2
3
4
5
6
@Autowired
private HelloSender helloSender;
@Test
public void hello() throws Exception {
helloSender.send();
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述