MQ全称为Message Queue,消息队列

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


部署RabbitMQ

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

docker pull rabbitmq:3.8.2-management
  • 1.

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

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
  • 1.

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

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

容器启动成功后,可以在浏览器输入地址:http://ip地址:15672/ 访问控制台

SpringBoot整合RabbitMQ_消息队列

SpringBoot整合RabbitMQ_应用程序_02

这里简单描述下上图中控制台的列表的作用:

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

SpringBoot整合RabbitMQ

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

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

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

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

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

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.
  • 14.
  • 15.
  • 16.
  • 17.
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.
  • 12.
  • 13.
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");
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

测试及结果

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

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

SpringBoot整合RabbitMQ_消息队列_03

SpringBoot整合RabbitMQ_消息队列_04

SpringBoot整合RabbitMQ_spring_05